我尝试了一本“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)
答案 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
因此,除了化妆品实施细节之外,没有任何区别。你只需要加入父母。
此外,当然,您不应该期望“线程外”和“开始线程”的任何特定顺序。两者并行运行,不能保证一个发生在另一个之前。