2012-09-21 13 views
6

Perl's documentation sagt: Seit Perl 5.8, Thread-Programmierung hat Wie funktioniert Perls Threading-System?

Mit ps -Lm <pid> mit dem Programm eines Modell namens Interpreter Threads zur Verfügung mit dem

für jeden Thread ein neues Perl-Interpreter bietet unter ich, dass Threads läuft parallel sehen dh sie werden gleichzeitig in verschiedenen Kernen ausgeführt. Aber selbst wenn es 4 Threads gibt (3 und das Haupt), zeigt ps aux nur einen Perl-Prozess an.

  1. Bedeutet dies, dass es ein ganzes Perl-Interpreter ist auf jedem Thread?
  2. SindPerl Threads-System-Threads abgebildet?
  3. Wenn 2 wahr ist, wie ist es möglich, mehrere Perl-Interpreter in einem einzigen Prozess zu haben?
use threads; 

$thr = threads->new(\&sub1); 
$thr2 = threads->new(\&sub1); 
$thr3 = threads->new(\&sub1); 

sub sub1 { 
     $i = 0; 
     while(true){ 
     $i = int(rand(10)) + $i; 
     } 
} 


$thr->join; 
+0

http://stackoverflow.com/questions/9973860/use-cases-for-reads-interpreter-threads-in-perl-and-rationale-for-using-or – user454322

+2

Ich empfehle dringend zu lesen [this] (http://www.perlmonks.org/index.pl?node_id=288022) vor der Verwendung "Perl Threads" in jedem Projekt .. – PSIAlt

+0

Weiterhin in Perl 5.20 Release Notes: Interpreter-basierte Threads werden nun abgeraten Die "Interpreter- Based Threads "von Perl sind nicht das schnelle, leichte System für Multitasking, das man erwarten oder erwarten könnte. Threads sind so implementiert, dass sie leicht missbraucht werden können. Nur wenige Menschen wissen, wie man sie richtig einsetzt oder können helfen. – Rob11311

Antwort

10

"Perl-Interpreter" bezieht sich auf die Umgebung, in der Perl-Code ausführt. Aus der Sicht eines Benutzers sind das hauptsächlich die Symboltabelle und die Globals darin, aber es enthält auch eine Reihe von internen Variablen (z. B. diejenigen, die während des Parsens, des aktuellen Ops usw. verwendet werden).

  1. Ja, es gibt einen Perl-Interpreter für jeden Thread.

  2. Ja, Perl-Threads sind System Threads.

  3. Denken Sie an "Perl-Interpreter" als eine Klasse, von der Sie beliebig viele Instanzen erstellen können. * Perl bezieht sich darauf als Multiplicity. Unter perlembed erfahren Sie, wie Sie einen Perl-Interpreter in Ihre Anwendung einbetten.


* — erfordert die Verwendung von -Dusemulitplicity wenn Perl Gebäude, das durch -Dusethreads impliziert ist, das ist, wie Faden Unterstützung Perl hinzugefügt wird. Ansonsten wird statt einer "Klasse" eine ganze Menge Globals verwendet.

6

Um Ikegamis Antwort auf Ihre dritte Frage zu verstärken, erstellt Perl eine vollständige Kopie des gesamten Status des Interpreters für jeden Betriebssystem-Thread. Dies bedeutet, dass alle Daten und der Code kopiert werden. Auf der anderen Seite macht dies das Erstellen von Threads langsam und Perl-Threads sind speicherhungrig.

Auf der Oberseite sind Threads voneinander isoliert, was es viel einfacher macht, Thread-sicheren Code zu schreiben. Zum Beispiel sind die meisten Module von Natur aus Thread-sicher, ohne dass der Autor irgendetwas Besonderes machen oder überhaupt über Threads nachdenken muss.

Dies ist Perls zweite Thread-Implementierung. Die ersten 5,005 Threads waren ein traditionelleres Threading-Modell, bei dem Threads Code und globale Variablen gemeinsam nutzen. Es hat nicht sehr gut funktioniert. Schlimmer noch, es machte die meisten CPAN-Module nutzlos, da ihre unkoordinierten globalen Variablen unter den verschiedenen Threads miteinander kollidierten.

Wie es möglich ist, ist eine Sache namens "Multiplizität", die Ikegami erwähnt und erklärt. Dies entstand ursprünglich aus dem Wunsch, einen Perl-Interpreter in ein anderes C- oder C++ - Programm einzubetten. Es musste geändert werden, wie Perl funktioniert, so dass es alle seine globalen Daten (globale Variablen und kompilierter Code) pro Interpreter-Objekt isoliert, statt davon auszugehen, dass es der einzige Perl-Interpreter ist, der in diesem Prozess läuft. Von dort aus wurde eine Vielzahl von Perl-Interpretern innerhalb eines Perl-Interpreters verwendet, um unter Windows fork zu emulieren. Endlich 5,6 Threads, die auf dieser umfangreichen Arbeit aufbauen.

Verwandte Themen