代码未在Ruby线程中执行

时间:2014-03-11 16:46:28

标签: ruby-on-rails ruby multithreading

我有一个使用一些线程的rake任务,现在我遇到了一个非常奇怪的案例...

有些代码没有执行,所以我开始玩简单的put语句......

基本上我有这个:

Thread.new do
  puts "hi"
  puts "there"
  [more code]
end

这是我的rake任务的三次连续运行:

$ rake task:execute
hi
there
$ rake task:execute
[nothing!]
$ rake task:execute
hi

我尝试过Ruby 2.0和2.1。

我不知道这个问题是否只是放入,但我认为不是因为代码没有被执行,这就是为什么我开始使用打印输出进行调试只是为了发现即使这样做也没有#39; t执行(总是)。

奇怪?

2 个答案:

答案 0 :(得分:1)

您需要保存对所有线程的引用,然后在每个线程上调用join以等待它们完成。一旦主线程退出,Ruby就不会等待其他线程。

threads = 3.times.map { Thread.new { puts "hello" } }
# do something else while threads run, if you want
threads.each(&:join)

答案 1 :(得分:1)

您的主线程(rake任务本身)可能在您的子线程完成之前完成。你可以这样做:

t = Thread.new do
  puts "hi"
  puts "there"
  [more code]
end

[do other stuff in the main thread]

t.join  # Let the subthread catch up