限制分叉进程的数量
Limit the number of forked processes
我正在尝试处理一个数组,每个元素都需要花费合理的时间来处理(≈30 分钟)。为了加快进程,我想使用 fork
,这样元素就可以在不同的进程中并行处理。但是我的数组有大约 1000 个元素,我不想一次制作 1000 个叉子。
我可以分批 n 做 fork
s 然后等到所有的都用 Process.waitall
完成但是有没有办法我可以上一个进程结束后立即开始一个新进程?
可以通过以下方式解决:
# 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
一个更简单的选择是将数组拆分为子数组并运行它们并行:
your_array.each_slice(@max_processes) do |elements|
elements.each do |element|
fork {
# do something with an element
}
end
Process.waitall
end
我正在尝试处理一个数组,每个元素都需要花费合理的时间来处理(≈30 分钟)。为了加快进程,我想使用 fork
,这样元素就可以在不同的进程中并行处理。但是我的数组有大约 1000 个元素,我不想一次制作 1000 个叉子。
我可以分批 n 做 fork
s 然后等到所有的都用 Process.waitall
完成但是有没有办法我可以上一个进程结束后立即开始一个新进程?
可以通过以下方式解决:
# 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
一个更简单的选择是将数组拆分为子数组并运行它们并行:
your_array.each_slice(@max_processes) do |elements|
elements.each do |element|
fork {
# do something with an element
}
end
Process.waitall
end