【问题标题】:ruby threading output红宝石线程输出
【发布时间】:2014-07-28 05:36:28
【问题描述】:

我正在尝试这个例子:

10.times do
  Thread.new do
    greeting_message = "Hello World ruby !"
    puts "#{greeting_message}
  end
end

我尝试多次运行它,有时puts 一次:

 Hello World ruby ! ruby basic_threadding_ruby.rb  0.05s user 0.04s system 97% cpu 0.096 total

有时是两次,有时是整整 10 次。

这种不一致让我感到困惑。 Hello World ruby ! 只打印一次是有原因的吗?我想当你运行一个 ruby​​ 脚本时,它会等到所有线程/进程都完成后再终止并返回。

【问题讨论】:

    标签: ruby multithreading puts


    【解决方案1】:

    我想当你运行一个 ruby​​ 脚本时,它会等到所有线程/进程都完成后才终止并返回?

    不!来自the documentation for Thread:

    如果我们在主线程终止前不调用thr.join,那么包括thr在内的所有其他线程都会被杀死。

    所以你需要加入所有这些:

    threads = 10.times.map do
      Thread.new do
        puts 'Hello, Ruby!'
      end
    end
    
    threads.each &:join
    

    【讨论】:

    • 非常感谢!抱歉,我应该在咨询之前阅读文档,但这就是我所缺少的!如果我可以再问一个问题,threads.each &:join 不一定以“正确的顺序”加入他们?他们仍然可以按照正确完成处理的随机顺序加入吗?
    • @user3358302: threads.each &:join 按顺序加入它们,但它们中的任意数量可能在加入时已经完成处理(在这种情况下,join 将立即返回),所以有差别不大。
    猜你喜欢
    • 1970-01-01
    • 2010-12-18
    • 2018-10-09
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    相关资源
    最近更新 更多