在Ruby中使用限制进行线程化

JP.*_*JP. 5 ruby queue multithreading

我有一个我需要执行的任务,do_stuff(opts)每个需要大约1个,即使其中1到10个并行运行.我需要在最后收集每个操作的结果数组.

如果我有30个东西做,我将如何有效使用线程来排队了do_stuff(opts)所以不超过10同时运行操作,但结果的排列没有给出/印刷/等等,直到所有(30)任务已经完成?

我通常至少有一些代码试图说明我的意思,但是使用线程我有点亏本!提前致谢

Nat*_*Nat 6

我不知道它对于更复杂的应用程序的效果如何,但我发现这样的东西可以很好地用于使用 macruby 的简单线程场景。

thread_limit = 4

threads = []
things_to_process.each do |thing|
  until threads.map { |t| t.status }.count("run") < thread_limit do sleep 5 end
  threads << Thread.new { the_task(thing) }
end
output = threads.map { |t| t.value }
Run Code Online (Sandbox Code Playgroud)

在允许主线程继续执行以启动下一个线程之前,直到循环等待直到运行的创建线程少于指定数量。

输出变量将被分配一个由 the_task 返回的值的数组,其排序对应于输入数组things_to_process。主线程将阻塞,直到每个创建的线程都返回一个值。

  • 我使用 thread.alive 运气更好?而不是状态:`threads.map {|t| t.alive?}.count(true)` (2认同)

Adi*_*rji 4

你需要实现这个模式
这个问题讨论了如何在 Ruby 中实现这一点