13

我想在 Sinatra Web 服务器的线程中执行“长时间运行”(执行大约需要 0.5 秒)任务。

网络响应大约需要 20 毫秒,所以如果我很忙,那么线程会堆积...

所以我想如果我很忙我会同步..

if (running_thread_count > 10)
    stuff_that_takes_a_second()
else
    Thread.new do
        stuff_that_takes_a_second()
    end
end

你如何获得正在运行的线程数(我想要启动的线程数,但尚未完成运行) - 你如何编写 running_thread_count?

def running_thread_count
 return Thread.list.count
end

还是我需要检查正在运行的线程?即当一个线程完成运行时,它会停止在 Thread.list 中返回吗?

我不想调用 join ,因为这会破坏目的 - 除非我们有很多线程在工作,否则会快速返回。

4

1 回答 1

26

这将给出处于“运行”状态而不是“睡眠”状态的线程数

def running_thread_count
  Thread.list.select {|thread| thread.status == "run"}.count
end
于 2012-05-24T05:00:29.923 回答