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

bianca
 2013-09-27 10:20
#170697 #170697
User since
2009-09-13
6977 Artikel
BenutzerIn

user image
Anhand der Beispiele in der Doku zum Modul erschließt sich mir noch nicht so recht der Aufbau bei CPAN:Parallel::ForkManager
Es soll ein Vater dauernd nach Auftragsdateien pollen. Wenn eine da ist soll ein Sohn damit weiter arbeiten. Siehe auch fork() wirft Fehler Free to wrong pool (Windows)
Aber dieses Script scheint eine Endlosschleife zu haben, denn es stürzt nach ein paar Sekunden ab.
Was mache ich falsch?
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
#!/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 "Warte auf Aufträge\n"
        },
        $config->{poll_interval},
    );
    my $lauf = 1;
    while ($lauf) {
        if (opendir my $vh,'.') {
            foreach my $file (
                grep {
                    $_ =~ /^[a-z0-9]\-auftrag.dat$/
                        &&
                    !-z $_
                }
                readdir $vh
            ) {
                print "Datei $file gefunden\n";
                rename($file,"$file-erl");
                my $pid = $forkmanager->start($file) and next;
                # Sohn
                print "Hier meldet sich Sohn '$pid' von der Front\n";
                $forkmanager->finish();
            }
        }
    }
    $forkmanager->wait_all_children;
}
else {
    die "Fehler, kann Konfigurationsdatei nicht oeffnen '$!'\n";
}

Code: (dl )
1
2
3
Datei 1-auftrag.dat gefunden
Sohn '-7568' startet mit Datei '1-auftrag.dat'
Hier meldet sich Sohn '0' von der Front

Kurz danach Absturz.
10 print "Hallo"
20 goto 10

View full thread Logikaufbau bei Parallel::ForkManager