2016-11-30 3 views
0

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(); 

} 
+0

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

+0

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

+0

Kann nicht wirklich sagen, warum Sie Semaphoren hier überhaupt verwenden. Ich meine, was ist los mit dem Warten auf eine 'Join'-Operation? – Sobrique

Antwort

0

Wenn in Ihrem Thread eine nicht abgefangene Ausnahme ausgelöst wird, wird der Semaphor niemals "hochgefahren". Es sieht so aus, als ob Sie den Semaphor verwenden, um darauf zu warten, dass der Thread beendet wird, was mit $thread->join sicherer erledigt werden kann.

Das geht davon aus, dass Sie über den ausgehenden Thread korrekt sind. Es könnte auch sein, dass der Thread angehalten hat (z. B. festgefahren ist) oder in eine Endlosschleife eingetreten ist.

Verwandte Themen