Thread Logikaufbau bei Parallel::ForkManager (36 answers)
Opened by bianca at 2013-09-27 10:20

bianca
 2013-09-28 07:53
#170737 #170737
User since
2009-09-13
6977 Artikel
BenutzerIn

user image
Irgendwas stimmt hier noch nicht ganz.
run_on_wait() habe ich schon mal raus genommen, das ist wenig hilfreich.
Im Hauptprogramm ist jetzt ein sleep() drin und auch im Sohn.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
use Parallel::ForkManager 1.05;

if (open(my $fh,'<','config.pl')) {
    my $config = eval do { 
        local $/;
        <$fh>;
    };
    die "Fehler, kann Konfigurationsdatei nicht verarbeiten '$@'\n" if $@;
    close($fh) or die "Fehler, kann Konfigurationsdatei nicht schliessen '$!'\n";
    my $forkmanager = Parallel::ForkManager->new($config->{max_prozesse});
    $forkmanager->run_on_start(
        sub {
            my ($pid,$file) = @_;
            print "Sohn '$pid' startet mit Datei '$file'\n";
        },
    );
    $forkmanager->run_on_finish(
        sub {
            my ($pid) = @_;
            print "Sohn '$pid' ist beendet\n";
        },
    );
#   $forkmanager->run_on_wait(
#       sub {
#           print "Naechster Prozess muss warten wegen max. Anzahl '$config->{max_prozesse}'\n"
#       },
#       $config->{poll_interval},
#   );
    my $lauf = 1;
    while ($lauf) {
        print "Warte auf Auftraege\n";
        if (opendir my $vh,$config->{data_pfad}) {
            foreach my $file (
                grep {
                    $_ =~ /^[a-z0-9]+\-auftrag.dat$/
                        &&
                    !-z $_
                }
                readdir $vh
            ) {
                print "Datei $file gefunden\n";
                rename("$config->{data_pfad}/$file","$config->{data_pfad}/$file-erl");
                my $pid = $forkmanager->start($file) and next;
                if (!$pid) {
                    # Sohn
                    print "Hier meldet sich ein Sohn von der Front\n";
                    sleep(20);
                    $forkmanager->finish();
                }
                else {
                    die "Fehler, kann Sohnprozess nicht starten\n";
                }
            }
        }
        sleep($config->{poll_interval});
        $lauf = 0 if -f "$config->{data_pfad}/stop.dat";
    }
    $forkmanager->wait_all_children;
}
else {
    die "Fehler, kann Konfigurationsdatei nicht oeffnen '$!'\n";
}

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Warte auf Auftraege
Warte auf Auftraege
Warte auf Auftraege
Warte auf Auftraege
Warte auf Auftraege
Warte auf Auftraege
Warte auf Auftraege
Warte auf Auftraege
>>hier habe ich die 1-auftrag.dat erzeugt<<
Datei 1-auftrag.dat gefunden
Sohn '-1708' startet mit Datei '1-auftrag.dat'
Hier meldet sich ein Sohn von der Front
Warte auf Auftraege
Warte auf Auftraege
Warte auf Auftraege
Warte auf Auftraege
Warte auf Auftraege
Warte auf Auftraege
Warte auf Auftraege
Warte auf Auftraege
Warte auf Auftraege
Warte auf Auftraege
Warte auf Auftraege
Warte auf Auftraege
Warte auf Auftraege
Warte auf Auftraege
Warte auf Auftraege
Warte auf Auftraege
Warte auf Auftraege
Warte auf Auftraege
Warte auf Auftraege
Warte auf Auftraege
>>hier wären 20 Sekunden rum <<
Warte auf Auftraege
Warte auf Auftraege
Warte auf Auftraege
Warte auf Auftraege
Warte auf Auftraege
Warte auf Auftraege
Warte auf Auftraege
Warte auf Auftraege
Warte auf Auftraege
>>hier habe ich die stop.dat erzeugt<<
Sohn '-1708' ist beendet

Die >> << Kennzeichnungen sind Kommentare, gehören nicht zur Ausgabe des Scripts.

Warum terminiert der Sohn nicht nach 20 Sekunden sondern erst ganz am Ende?
Liegt das auch an der doofen Prozessverwaltung von Windows?
GwenDragon: Wie lief das bei deinen Tests? Sind da die Sohnprozesse auch erst ganz am Ende alle zusammen beendet worden?

Übrigens bin ich jetzt mit Perl v5.16.3 32Bit auf Win7 32Bit unterwegs.
10 print "Hallo"
20 goto 10

View full thread Logikaufbau bei Parallel::ForkManager