Unterstützt das Modul Parallel :: ForkManager () die Synchronisation für globale Variablen?

8

Ich bin sehr neu in diesem Parallel :: ForkManager -Modul in Perl und es hat eine Menge Credits, also denke ich, dass es unterstützt, was ich brauche und ich habe es noch nicht herausgefunden.

Was ich tun muss, ist in jedem Kindprozess, es schreibt einige Updates in eine globale Hash-Map, entsprechend dem Schlüsselwert, der in jedem Kindprozess berechnet wird. Wenn ich jedoch eine Hash-Map außerhalb der for-Schleife beanspruche und erwarte, dass die Hash-Map nach der Schleife aktualisiert wird, stellt sich heraus, dass die Hash-Map leer bleibt. Dies bedeutet, dass die Aktualisierung innerhalb der Schleife zwar erfolgreich ist (durch Ausdrucken des Werts), außerhalb der Schleife jedoch nicht.

Weiß jemand, wie man einen solchen Code schreibt, der tut, was ich will?

    
galactica 19.02.2010, 01:53
quelle

3 Antworten

6

Dies ist nicht wirklich ein Perl-spezifisches Problem, sondern eine Frage des Verständnisses von Unix-ähnlichen Prozessen. Wenn Sie fork auf einen neuen Prozess anwenden, wird standardmäßig kein Speicher zwischen Prozessen freigegeben. Es gibt ein paar Möglichkeiten, wie Sie das erreichen können, was Sie wollen, je nachdem, was Sie brauchen.

Ein einfacher Weg wäre, BerkeleyDB zu verwenden, um einen Hash mit einer Datei auf der Festplatte zu verknüpfen. Der gebundene Hash kann vor der Verzweigung initialisiert werden, und dann hat jeder untergeordnete Prozess Zugriff darauf. BerkeleyDB-Dateien sind für den sicheren Zugriff aus mehreren Prozessen gleichzeitig konzipiert.

Eine kompliziertere Methode wäre die Verwendung einer Form der Kommunikation zwischen den Prozessen. Für all die blutigen Details, um dies zu erreichen, siehe die Manpage perlipc , die Details zu verschiedenen IPC-Methoden enthält, die von Perl unterstützt werden.

Ein letzter Ansatz, wenn Ihr Perl dies unterstützt, besteht darin, Threads zu verwenden und Variablen zwischen ihnen zu teilen.

    
friedo 19.02.2010, 02:10
quelle
4

Jeder Aufruf von fork erzeugt einen brandneuen Prozess, sodass Aktualisierungen an einer Hash-Variablen in einem untergeordneten Prozess im übergeordneten Prozess nicht sichtbar sind (und Änderungen am übergeordneten Prozess nach dem Aufruf von fork im untergeordneten Prozess nicht sichtbar sind).

Sie könnten threads verwenden (und auch threads::shared ), damit eine in einem Thread geschriebene Änderung in einen anderen Thread geschrieben werden kann.

Eine andere Option besteht darin, Interprozesskommunikation zu verwenden, um Nachrichten zwischen übergeordneten und untergeordneten Prozessen zu übergeben. Das Modul Forks::Super (von dem ich der Autor bin) kann dies weniger Kopfschmerzen bereiten. p>

Oder Ihre untergeordneten Prozesse könnten Ausgaben in Dateien schreiben. Wenn der Parent-Prozess sie abholt, kann er die Daten aus diesen Dateien laden und seine globale Hash-Map entsprechend aktualisieren.

    
mob 19.02.2010 02:09
quelle
2

Lesen Sie den Abschnitt "ABRUFEN VON DATASTRUKTUREN aus untergeordneten Prozessen" von man Parallel :: ForkManager. Es gibt Callbacks, Kinddaten können gesendet werden und Eltern können sie abrufen und Datenstrukturen auffüllen.

    
psena 18.06.2012 17:27
quelle