Kategorie: Programming, Perl
Perl-Skripte parallelisieren
Wenn Perl-Code parallel ablaufen soll, könnte man das Skript mehrfach im Hintergrund starten. Es geht aber auch eleganter.
Das Perl-Modul Parallel::ForkManager bietet eine einfach anzuwendende Möglichkeit, Codeteile wie z. B. Schleifen zu parallelisieren. Dabei muss sich der Programmierer nicht um Threads oder ähnliches Zeug kümmern. Er muss nur angeben, an welcher Stelle im Code die Parallelisierung beginnen soll und wo sie enden soll. Zusätzlich muss noch darauf geachtet werden, dass der Vaterprozess erst beendet wird, wenn alle Kindprozesse terminiert haben.
Dem Konstruktor von Parallel::ForkManager kann die maximale Anzahl an parallelen Threads as Parameter übergeben werden.
Beispiel:
#!/usr/bin/perl
use Parallel::ForkManager;
my $m = new Parallel::ForkManager(4);
for(1..100) {
$m->start and next;
do_some_weird_calculations();
$m->finish;
}
$m->wait_all_children();
Im obigen Beispiel wird in einer Schleife hundert Mal die Prozedur do_some_weird_calculations aufgerufen. Dabei werden jeweils vier Aufrufe parallel ausgeführt. Nach erfolgreichem Aufruf von start springt der Vaterprozess mit next sofort zum nächsten Schleifendurchlauf weiter. Zum Schluss wird noch gewartet, bis alle Kindprozesse beendet sind.
Wenn parallelisiert auf eine Datenbank zugegriffen werden soll, muss die Datenbank-Verbindung innerhalb von start und finish jedesmal neu geöffnet werden. Die Verbindung außerhalb zu öffnen und alle Kinder auf diese Verbindung zugreifen zu lassen, funktioniert meist nicht.