Gibt es eine Möglichkeit verwalteten Prozesse in Perl haben (das heißt ein Gewinde Ersatz, das tatsächlich funktioniert)?
-
02-07-2019 - |
Frage
Ich habe eine multithreded Anwendung in Perl für die ich auf mehr nicht-Thread-sicher-Module angewiesen bin, so habe ich fork()
ed Prozesse unter Verwendung von mit kill()
Signalen als Message-Passing Interface.
Das Problem ist, dass die Signal-Handler ein bisschen unberechenbar sind (gelinde gesagt) und oft mit Prozessen enden, die in inapropriate Staaten getötet.
Gibt es einen besseren Weg, dies zu tun?
Lösung
Hier finden Sie aktuelle forks.pm , ein „Drop-in-Ersatz für Gewinde Perl mit fork ()“, die für viel sinnvolle Speichernutzung macht (aber nicht verwenden auf Win32). Es ermöglicht Ihnen, „shared“ Variablen zu deklarieren und dann übergibt sie automatisch auf solche Variablen zwischen den Prozessen vorgenommenen Änderungen (ähnlich wie threads.pm Dinge tut).
Andere Tipps
Je nach genau das, was Ihr Programm tun muss, könnte man mit berücksichtigen POE , die Perl ist ein Rahmen für Anwendungen mit Benutzerraum Gewinde Multi-threaded. Es ist komplex, aber elegant und leistungsfähig und können Sie nicht-Thread-sichere Module durch Begrenzung Aktivität auf einen einzelnen Perl-Interpreter-Thread.
vermeiden helfenHilfreiche Ressourcen, um loszulegen:
- Programmierung POE Präsentation von Matt Sergeant (hier beginnen zu verstehen, was es ist und tut)
- POE Projektseite (viele Kochbuch Beispiele)
Darüber hinaus gibt es Hunderte von vorgefertigten POE Komponenten Sie können in einer Anwendung zusammen verwenden.
Sie können immer ein Rohr zwischen Elternteil und Kind Nachrichten hin und her zu übergeben.
pipe my $reader, my $writer;
my $pid = fork();
if ( $pid == 0 ) {
close $reader;
...
}
else {
close $writer;
my $msg_from_child = <$reader>;
....
}
Nicht eine sehr bequeme Art der Programmierung, aber es sollte nicht ‚unberechenbar‘ sein.
Von Perl 5.8 ab sollten Sie am Kemfäden Modul suchen werden. Hier finden Sie aktuelle http://metacpan.org/pod/threads
Wenn Sie Module verwenden, die nicht Thread-sicher sind, können Sie in der Regel, sie laden mit einem erfordern und Import innerhalb des Fadeneintrittspunkt.