Ich habe ein Programm (Perl), die eine große Anzahl von Threads startet (jeder verantwortlich für die Erstellung von Grafiken basierend auf Datenverarbeitung). Jeder Thread ich mit Start:Wie die maximale Anzahl der parallelen Threads in Perl zu begrenzen
my @threads //list to store threads that have been launched
push @threads,threads->create(\mySubName,params...);
Die Fäden richtig, aber nach einer Weile abfeuern, nachdem ich mehrere von ihnen Perl-Interpreter Abstürze geöffnet (ich nehme an, es in dem Speicher verwendet ist?). Also meine Lösung ist, die Anzahl der Threads zu begrenzen, die ich auf einmal öffne. Ich habe 15 ausgewählt. Und ich möchte vor jeder Erstellungszeile ein Sub hinzufügen, um zu überprüfen, ob es in Ordnung ist, den nächsten Thread auszulösen oder einen Schlaf auszuführen, während ich warte für einen zu beenden. So habe ich es versucht.
sub checkThreads{
my $addThread = 0;
until($addThread){
my $totalThreads = 0;
foreach my $task (@threads){
if($task->is_running()){$totalThreads++;}
}
if($totalThreads <= 15){
print "Ok to add new thread, carry on!\n";
$addthread = 1;
}else{
print "Waiting for $totalThreads threads to fire next one...\n";
sleep 2;
}
}
}
Also jedes Mal, wenn ich einen neuen Thread erstellen möchte ich
&checkThreads;
rufen Sie einfach Und das würde Sorgfalt um eine Verzögerung zu schaffen machen, während ich für einige Threads warten bis zu reinigen. Das Problem ist, dass, wenn ich das Unter nennen, der Moment, als ich die Linie treffen, wo ich überprüfen:
$task->is_running()
das Programm beendet und nicht mehr ohne Fehler oder Warnung ausgeführt wird. Ich will nur ein Sub, das die laufenden Threads zählt, um sie zu begrenzen.
Wie kann ich diese Zählung erfolgreich durchführen?
Andere Dinge, die ich versucht habe, werten Sie die folgende Zeile:
scalar(threads->list());
Aber das gibt mir einen seltsamen Wert, wie es eine unblessed Referenz glaube ich, dass wie folgt aussieht:
threads=SCALAR(0x80fea8c)
btw, das ist (stringification a) gesegnet * * ref – ikegami
sehr, sehr BTW - Denken Sie daran, dass Threads in Perl nicht wie Threads in anderen Programmiersprachen sind - sie sind sehr ressourcenhungrig, da jeder Thread eine COPY aller Variablen hat.In einigen Fällen sind sie immer noch nützlich, aber in allen Fällen, in denen ich Paralellisierung durchführen muss, funktioniert Forking viel besser. Es hängt nicht direkt mit deiner Frage zusammen, ich wollte dir das nur sagen. :) –
Welche Version von Perl? Welche Version von Threads? Und sind deine Threads losgelöst (vielleicht in mySubName selbstlösend)? – pilcrow