ruby - 有限制的 Ruby 线程

标签 ruby multithreading queue

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

如果我有 30 件事情要做,我将如何有效地使用线程来排队 do_stuff(opts) 操作,以便同时运行不超过 10 件,但没有给出结果数组/print/etc 直到完成所有 (30) 个任务?

我通常至少有一些代码来尝试说明我的意思,但是对于线程我有点不知所措!提前致谢

最佳答案

我不知道它对于更复杂的应用程序的效果如何,但我发现类似这样的东西非常适合使用 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 }

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

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

关于ruby - 有限制的 Ruby 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1697504/

相关文章:

java - 关于相同/不同对象上的 java 线程的混淆

c# - 了解 WPF 中提供的 DispatcherPriority 枚举的真实行为

c++ - priority_queue 的问题 - 在堆之后写入内存

Laravel 队列优先级和保留

ruby - Bundler 锁定在 docker + 无法安装 gems(已解决 - docker CMD vs ENTRYPOINT)

ruby-on-rails - Rails 4 & 茧 gem : Cannot add 3rd level child to dynamically added 2nd level child

ruby - default_proc 是如何工作的

android - 如何与连接到汽车的单个 Obd2 蓝牙设备建立多个连接

python - 不间断地将对象添加到队列中

Ruby 方法链