ruby - Thread.join 阻塞主线程

标签 ruby multithreading

调用 Thread.join 会阻塞当前(主)线程。然而,当主线程退出时,不调用 join 会导致所有生成的线程被杀死。如何在不阻塞主线程的情况下在 Ruby 中生成持久性子线程?

这是连接的典型用法。

for i in 1..100 do
  puts "Creating thread #{i}"
  t = Thread.new(i) do |j|
    sleep 1
    puts "Thread #{j} done"
  end
  t.join
end
puts "#{Thread.list.size} threads"

这给出了

     Creating thread 1  
     Thread 1 done  
     Creating thread 2  
     Thread 2 done  
     ...  
     1 threads  

但是我正在寻找如何得到这个

    Creating thread 1  
    Creating thread 2  
    ...  
    101 threads  
    Thread 1 done  
    Thread 2 done  
    ...  

代码在 Ruby 1.8.7 和 1.9.2 中给出相同的输出

最佳答案

您只需将线程累积到另一个容器中,然后在它们全部创建后将它们一个接一个地加入:

my_threads = []
for i in 1..100 do
    puts "Creating thread #{i}"
    my_threads << Thread.new(i) do |j|
        sleep 1
        puts "Thread #{j} done"
    end
end
puts "#{Thread.list.size} threads"

my_threads.each do |t|
    t.join
end

您也不能将线程绑定(bind)到 i 变量,因为 i 会不断被覆盖,您的输出将是 100 行“Thread 100 done”;相反,您必须将它绑定(bind)到 i 的副本,我巧妙地将其命名为 j

关于ruby - Thread.join 阻塞主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3481866/

相关文章:

ruby-on-rails - ruby 只拒绝哈希数组中的某些重复项

ruby-on-rails - 如何在 RSpec 测试中打开 ActiveRecord 的 SQL 调试日志记录?

swift - 调度队列 : why does serial complete faster than concurrent?

c - 优雅地杀死 C 的 pthread 中的阻塞线程?

c++ - 是否可以直接访问线程共享变量?

ruby-on-rails - 谷歌地图、Ruby on Rails、用一个标记缩放级别

ruby-on-rails - 将 http_params 转换为哈希

ruby - Mongoid 是否可以覆盖 updated_at 时间戳

c# - 跨线程使用引用对象

java - 尝试通知线程已使用 Exchanger 创建对象会导致两个线程都被锁定