Wenn ich Sie richtig gelesen habe, möchten Sie nicht mehr als 4 Threads gleichzeitig verarbeiten.
Klingt für mich so, als sollten Sie nur 4 Threads starten und alle aus einer gemeinsam genutzten Warteschlange (Teil der Standard-Thread-Bibliothek) lesen lassen, um die Elemente zu verarbeiten.
Sie können die Threads beenden lassen, wenn die Warteschlange leer ist.
Wenn Sie das Array in 4 gleiche Arrays aufteilen und jeder Thread 1/4 der Elemente verarbeitet, wird davon ausgegangen, dass jedes Element zur gleichen Zeit verarbeitet wird. Wenn einige länger dauern als andere, werden einige Ihrer Threads vorzeitig beendet.
Bei Verwendung einer Warteschlange stoppt kein Thread, bis die gemeinsam genutzte Warteschlange leer ist. Ich denke, dies ist eine effizientere Lösung.
Hier ist ein Arbeitsprogramm, das auf Ihrem Code basiert, um zu demonstrieren:
require 'thread'
elements = [1,2,3,4,5,6,7,8,9,10]
def process(element)
puts "working on #{element}"
sleep rand * 10
end
queue = Queue.new
elements.each{|e| queue << e }
threads = []
4.times do
threads << Thread.new do
while (e = queue.pop(true) rescue nil)
process(e)
end
end
end
threads.each {|t| t.join }