限制分叉进程的数量

Uko*_*Uko 4 ruby process

我正在尝试处理一个数组,每个元素需要一个合理的时间来处理(≈30分钟).为了加速我想要使用的进程fork,所以元素可以在不同的进程中并行处理.但是我的数组有大约1000个元素,我不想一次制作1000个分叉.

我可以fork分批进行n然后等到所有这些都结束了Process.waitall但是有没有办法可以在前一个结束时立即启动新进程?

Uko*_*Uko 6

解决方案可以通过以下方式实现:

# assign maximum number of processes
counter = @max_processes

# when a child process ends increase the counter of available processes
Signal.trap("CLD")  { counter += 1 }    

your_array.each do |element|

  # wait for a child process to end if there are no more "available processes"
  Process.wait if counter <= 0

  # before launching a process decrease the "available processes" counter
  counter -= 1

  fork {
    # do something with an element
  }

end
Run Code Online (Sandbox Code Playgroud)

更简单的选择是将数组拆分为子数组并并行运行:

your_array.each_slice(@max_processes) do |elements|

  elements.each do |element|
    fork {
      # do something with an element
    }
  end

  Process.waitall

end
Run Code Online (Sandbox Code Playgroud)