2
我正在嘗試處理數組,每個元素都需要合理的時間來處理(≈30分鐘)。爲了加速這個過程,我想使用fork
,所以元素可以在不同的進程中並行進程。但是我的陣列有大約1000個元素,我不想立刻製作1000個分叉。限制分叉進程的數量
我可以在ň批次做fork
秒,然後等待,直到所有的人都用Process.waitall
完成,但有什麼辦法,我可以馬上一個前一個結束的開始一個新的進程?
我正在嘗試處理數組,每個元素都需要合理的時間來處理(≈30分鐘)。爲了加速這個過程,我想使用fork
,所以元素可以在不同的進程中並行進程。但是我的陣列有大約1000個元素,我不想立刻製作1000個分叉。限制分叉進程的數量
我可以在ň批次做fork
秒,然後等待,直到所有的人都用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