ich ein Perl-Skript haben, geht das über eine Warteschlange von Dateien und Prozessdateien in verschiedenen Threads:Perl-Threads nicht mehr funktionieren plötzlich nach langer läuft
Unten ist ein Ausschnitt, nachdem die Dateien Warteschlange füllt. Das Problem ist, manchmal, wenn ich es zu lange läuft (12-24 Stunden), komme ich zurück, um das Skript hängen zu sehen.
Ich habe Protokolldateien für jeden Thread, ich sehe, dass der letzte Zeitstempel der Aktivität für alle von ihnen immer gleich ist. Das Skript wird jedoch nicht beendet, was bedeutet, dass die Threads den Semaphor nicht zurückgeben. Auch bin ich mir sicher, dass die Threads nicht richtig beendet haben, weil ich immer noch sehen kann, dass die Warteschlange voller Dateien ist, die bearbeitet werden müssen.
Ich habe ein Protokoll vor und nach dem Aufruf der EXE, und die letzte Ablaufverfolgung ist immer die nach dem Aufruf der EXE. Kann keine rationale Erklärung finden.
#initiate all threads
for(my $i = 0; $i < $max_thread; $i++)
{
my $my_thread = threads->new(sub { start() });
push(@Threads, $my_thread);
}
$semaphore->down($max_thread);
terminate();
sub start
{
$SIG{INT} = sub { thread_exit() };
while((my $file = $file_queue->dequeue_nb))
{
#This function calls an external EXE
processFile($file);
}
#Thread ended
$semaphore->up();
}
Wir können auch nicht wissen, was in 'processFile' vor sich geht. Könnte der Thread abnormal abbrechen und somit den Semaphor nicht freigeben. . – Sobrique
Auch: warum 'dequeue_nb'? Warum "queue" und "beende" die Warteschlange nicht, wenn Sie mit der Verarbeitung fertig sind. Auch - 'new (sub {start()})' - warum brauchst du einen anonymen Sub, um einen anderen Sub aufzurufen. Ist 'thread -> create (\ & start)' aus irgendeinem Grund nicht wirklich ausreichend? – Sobrique
Kann nicht wirklich sagen, warum Sie Semaphoren hier überhaupt verwenden. Ich meine, was ist los mit dem Warten auf eine 'Join'-Operation? – Sobrique