【问题标题】:Ruby check if a thread is "free"Ruby 检查线程是否“空闲”
【发布时间】:2011-11-27 14:21:52
【问题描述】:

我想要一个线程数组[],这样如果一个线程“空闲”或不在任何程序上工作,那么它将被分配一个新任务。

是否有办法检查 ruby​​ 中的线程是否“免费”。目前我用过

if (threads[thread_id].nil? || !threads[thread_id].status)
    # yes thread is free

但似乎不是正确的方式,一些线程仍然覆盖其他工作。

【问题讨论】:

  • @steenslag 我没有看到任何类似的东西......在那个主题中,他们需要一个队列来存储作品。我不需要,我只想知道一个线程是否可以免费使用
  • 也许可以测试alive?,或者如果您下定决心要同时拥有多个线程,请检查Thread.list.size

标签: ruby multithreading


【解决方案1】:
threads.each.map {|t| t.alive?}.none?

如果所有线程都死了,则返回 true

如果你有这样的事情:

threads << Thread.new do
 # do dome work ...
end

如果你想检查所有线程是否都没有存活(即死亡),你可以随时使用:

threads.each.map {|t| t.alive?}.none?

我们从数组中一个一个地获取线程并检查它是否还活着。 map 方法正在创建具有真/假值(活/死)的数组。终于没有了?如果所有成员都是假的(即所有线程都死了),枚举方法应该返回真

【讨论】:

    【解决方案2】:

    查看Deadlock in ThreadPool 的答案以了解有效的线程池实现。

    使用线程池,您可以执行以下操作:

    pool = ThreadPool.new(10) # up to 10 threads
    email_addresses.each do |addr|
      pool.process {send_mail_to addr}
    end
    

    如果没有空闲线程来完成工作,ThreadPool#process 将阻塞,并在有空闲线程时继续。

    还有一些 gem 实现了线程池,比如:http://rubygems.org/gems/work_queue

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-16
      • 2011-10-19
      • 1970-01-01
      • 2011-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-19
      相关资源
      最近更新 更多