2013-03-15 10 views
9

Ich muss wissen, wie Multi-Threading für den folgenden Code zu implementieren. Ich muss dieses Skript jede Sekunde aufrufen, aber der Sleep-Timer verarbeitet es nach 2 Sekunden. Insgesamt ruft das Skript nach jeweils 3 Sekunden auf. Aber ich muss es jede Sekunde nennen, kann mir jemand eine Lösung anbieten oder mir die richtige Richtung zeigen.Multithreading für Perl-Code

Es ist nur ein Beispiel.

Antwort

24

Hier ist ein einfaches Beispiel der Verwendung von Fäden:

use strict; 
use warnings; 
use threads; 

sub threaded_task { 
    threads->create(sub { 
     my $thr_id = threads->self->tid; 
     print "Starting thread $thr_id\n"; 
     sleep 2; 
     print "Ending thread $thr_id\n"; 
     threads->detach(); #End thread. 
    }); 
} 

while (1) 
{ 
    threaded_task(); 
    sleep 1; 
} 

Dies wird ein Thread in jeder Sekunde erstellen. Der Thread selbst dauert zwei Sekunden.

Weitere Informationen zu Threads finden Sie unter the documentation. Eine wichtige Überlegung ist, dass Variablen nicht zwischen Threads geteilt werden. Duplizierte Kopien all deiner Variablen werden erstellt, wenn du einen neuen Thread startest.

Wenn Sie gemeinsame Variablen benötigen, look into threads::shared.

Bitte beachten Sie jedoch, dass das richtige Design davon abhängt, was Sie tatsächlich tun. Was aus Ihrer Frage nicht klar ist.

Einige andere Kommentare zu Ihrem Code:

  • Immer use strict; helfen Sie Best Practices in Ihrem Code verwenden.
  • Die korrekte Deklaration einer lexikalischen Variablen ist my $gg; statt local $gg;. local erstellt tatsächlich keine lexikalische Variable; Es gibt einen lokalisierten Wert für eine globale Variable. Es ist nicht etwas, das Sie sehr oft verwenden müssen.
  • Vermeiden Sie Subroutinen den gleichen Namen wie Systemfunktionen (z. B. print). Das ist verwirrend.
  • Es wird nicht empfohlen, & vor dem Aufruf von Subroutinen zu verwenden (in Ihrem Fall war es wegen eines Konflikts mit einem Systemfunktionsnamen notwendig, aber wie gesagt, das sollte vermieden werden).
+0

Gute Antwort. Wissen Sie, was ist eine gute Quelle für das Verständnis von Threads in Bezug auf mehrere Threads Lesen und Schreiben der gleichen globalen Variablen gleichzeitig? – Myforwik

+0

@Myforwik, sehen Sie bitte das Update auf die Antwort. Variablen werden nicht zwischen Threads geteilt. Sie müssen dafür 'threads :: shared' verwenden. Die zwei Dokumentationslinks, die ich der Antwort hinzugefügt habe, sollten helfen, dies zu verstehen. –

+0

Danke, es wird tun ... /// – NewBee