Ich habe ein Perl-Skript, das zwei Threads startet, einen für jeden Prozessor. Ich brauche es zu warten, bis ein Thread endet, wenn ein Thread endet und ein neuer erzeugt wird. Es scheint, dass die Join-Methode den Rest des Programms blockiert, daher kann der zweite Thread nicht enden, bis alles, was der erste Thread tut, erledigt ist, was seinen Zweck vereitelt.
Ich habe versucht, die is_joinable
Methode, aber das scheint es auch nicht zu tun.
Hier ist ein Teil meines Codes:
%Vor%Die Ausgabe davon ist:
%Vor%Ich denke, Sie müssen den Code verschieben, der die nächste Datei aus der Liste in die Threads selbst zieht.
So würde jeder Thread nicht nur eine Datei verarbeiten, sondern weiterarbeiten, bis die Liste leer ist.
Auf diese Weise sparen Sie auch den Overhead beim Erstellen neuer Threads die ganze Zeit.
Ihr Haupt-Thread wird dann beide verbinden.
Dies erfordert natürlich die Synchronisation auf der Liste (damit sie nicht dieselben Daten abrufen). Alternativ könnten Sie die Liste in zwei Teile aufteilen (eine für jeden Thread), was jedoch zu einer unglücklichen Verteilung führen kann.
(PS: Kein Perl Gott, nur ein bescheidener Mönch)
Zunächst ein paar Kommentare zum Code selbst. Sie müssen sicherstellen, dass Sie:
%Vor%am Anfang von jedem Skript. Zweitens:
%Vor%ist nicht erforderlich, da ein Array im skalaren Kontext die Anzahl der Elemente im Array berechnet. Das ist:
%Vor% gibt Ihnen die Anzahl der Dateien in @ARGV
korrekt an, unabhängig vom Wert von $[
.
Schließlich kann das Skript durch Partitionieren der Liste der Dateien vor dem Starten der Threads vereinfacht werden:
%Vor%Ausgabe:
%Vor%Alternativ können Sie die Threads zur nächsten Task weiterleiten lassen, wenn sie fertig sind:
%Vor%Ausgabe:
%Vor%Tags und Links multithreading perl join locking