NAME

Quiq::Parallel - Parallele Verarbeitung

BASE CLASS

Quiq::Object

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.