NAME
Quiq::Parallel - Parallele Verarbeitung
BASE CLASS
EXAMPLE
Minimales Veranschaulichungsbeispiel: Lasse 50 Prozesse für jeweils eine Sekunde schlafen. Die Ausführungsdauer beträgt ungefähr 50/Anzahl CPUs Sekunden, da immer Anzahl CPUs Prozesse parallel ausgeführt werden.
Quiq::Parallel->runArray([1..50],sub {
my ($elem,$i) = @_;
sleep 1;
return;
});
Bei großen Datenmengen oder wenn die Gesamtmenge vorab nicht bekannt ist, bietet sich die Methode $class->runFetch() an. Hier ein Beispiel mit einer unbekannt großen Datenbank-Selektion:
my $cur = $db->select("
<SELECT Statement>
",
-cursor => 1,
);
Quiq::Parallel->runFetch(sub {
my $i = shift;
return $cur->fetch;
},
sub {
my ($row,$i) = @_;
<$row verarbeiten>
return;
},
);
METHODS
Parallele Berechnung
runArray() - Führe Subroutine parallel über Arrayelementen aus
Synopsis
$class->runArray(\@elements,$sub,@opt);
Arguments
- @elements
-
Die Elemente, auf denen die Berechnung einzeln durchgeführt wird.
- $sub
-
Die Subroutine, die für jedes Element in @elements ausgeführt wird.
Options
Die gleichen wie runFetch().
Returns
nichts
runFetch() - Führe Subroutine parallel über gefetchten Elementen aus
Synopsis
$class->runFetch($fetchSub,$execSub,@opt);
Arguments
- $fetchSub
-
Subroutine, die das nächste gefetchte Element liefert:
$e = $fetchSub->($i); # $i-ter Fetch-Aufruf
- $execSub
-
Subroutine, die für jedes gefetchte Element ausgeführt wird.
Options
- -maxFetches => $n (Default: 0)
-
Gesamtanzahl der Fetches. 0 bedeutet, die Gesamtanzahl der Fetches ist (vorab) nicht bekannt.
- -maxProcesses => $n (Default: Anzahl der CPUs des Rechners)
-
Die maximale Anzahl parallel laufender Prozesse.
- -outputDir => $dir (Default: undef)
-
Verzeichnis, in das die Ausgaben der Prozesse auf STDOUT und STDERR geschrieben werden, jeweils in eine eigene Datei mit dem Namen
NNNNNN.out
Die sechstellige Zahl NNNNNNN ist die Nummer des Prozesses in der Aufrufreihenfolge.
- -outputFile => $file (Default: undef)
-
Datei, in der die Ausgaben aller Prozesse (chronologische Aufrufreihenfolge) zusammengefasst werden. Dies geschieht nach Beendigung des letzten Prozesses. Wird '-' als Dateiname angegeben, wird die Ausgabe nach STDOUT geschrieben. ACHTUNG: Bricht das steuernde Programm ab, wird keine Ausgabe produziert. Die Ausgabedateien verschwinden mit dem temporären Verzeichnis, in dem sie gespeichert werden.
- -progressMeter => $bool (Default: 1)
-
Zeige Fortschrittsanzeige an.
- -progressNameSub => sub {}
-
Liefere die Bezeichnung des Elements für die Fortschrittsanzeige. Dies ist erforderlich, wenn das Element ein Objekt ist. Beispiel:
-progressNameSub => sub { my $obj = shift; return $obj->bezeichnung; },
Returns
nichts
Description
Verarbeite die Elemente, die von Subroutine $fetchSub geliefert werden, mit der Subroutine $execSub mit parallel laufenden Prozessen. Per Default wird für die Anzahl der parallelen Prozesse die Anzahl der CPUs des ausführenden Rechners gewählt. Mit der Option -maxProcesses kann eine abweichende Anzahl gewählt werden.
Tipp: Die Anzahl der vorhandenen CPUs liefert die Methode
$n = Quiq::System->numberOfCpus;
Die Ausgaben der Prozesse auf STDOUT und STDERR werden in Dateien gespeichert, wenn Option -outputDir und/oder -outputFile angegeben sind.
VERSION
1.171
AUTHOR
Frank Seitz, http://fseitz.de/
COPYRIGHT
Copyright (C) 2020 Frank Seitz
LICENSE
This code is free software; you can redistribute it and/or modify it under the same terms as Perl itself.