解决方案可以通过以下方式实现:
# 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)
| 归档时间: |
|
| 查看次数: |
543 次 |
| 最近记录: |