与ruby 1.9.3相比,ruby2.0中的线程逻辑是否已更改?

时间:2013-11-20 10:12:23

标签: ruby multithreading ruby-2.0

我尝试了一本“Well Ground Redist”一书中的一个例子,该书在我的Ruby 2.0中使用了Ruby 1.9 并获得不同的结果。而不是书的结果:

  

启动帖子

     

线程之外

我只是第二行:

  

线程之外

这是代码示例:

Thread.new do 
  puts "Starting a thread"
  sleep 2
  puts "At the end of the thread"
end

puts "Outside the thread"

为什么会这样?

你可以在这里看到不同的结果:(在线ruby解释器 - 首先是ruby 1.9,第二个是ruby 2.0)

http://www.compileonline.com/execute_ruby_online.php

http://ideone.com/XkGn2a

1 个答案:

答案 0 :(得分:2)

如果将其作为可执行文件而不是IRB运行,则还需要使子线程在某个时刻加入父线程。否则孩子将在父母完成后被杀。

#!/usr/bin/env ruby

t = Thread.new do 
  puts "Starting a thread"
  sleep 2
  puts "At the end of the thread"
  nil
end

puts "Outside the thread"

t.join

我无法在笔记本电脑上重现不同的输出:

~/wk $ /usr/bin/ruby --version
ruby 1.8.7 (2012-02-08 patchlevel 358) [universal-darwin11.0]
~/wk $ /usr/local/bin/ruby --version
ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin11.4.2]

使用t.join

~/wk $ /usr/bin/ruby test.rb 
Starting a thread
Outside the thread
At the end of the thread
~/wk $ /usr/local/bin/ruby test.rb
Starting a thread
Outside the thread
At the end of the thread

没有t.join

~/wk $ /usr/bin/ruby test.rb 
Starting a thread
Outside the thread
~/wk $ /usr/local/bin/ruby test.rb
Starting a thread
Outside the thread

我确实在我的服务器上重现了它们:

~ $ ruby --version
ruby 1.9.3p448 (2013-06-27 revision 41675) [amd64-freebsd9]

使用t.join

~ $ ruby test.rb 
Outside the thread
Starting a thread
At the end of the thread

没有t.join

~ $ ruby test.rb 
Outside the thread

但是,如果我在脚本的末尾添加sleep 1,我会得到以下内容:

~ $ ruby test.rb 
Outside the thread
Starting a thread

因此,除了化妆品实施细节之外,没有任何区别。你只需要加入父母。

此外,当然,您不应该期望“线程外”和“开始线程”的任何特定顺序。两者并行运行,不能保证一个发生在另一个之前。