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

bianca
 2013-09-28 12:48
#170773 #170773
User since
2009-09-13
6977 Artikel
BenutzerIn

user image
Habe das ganze mal dem Endziel näher gebracht, nämlich mit CPAN:IPC::Run kombiniert.
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
67
68
69
#!/usr/bin/perl
require 5.016_003;
use strict;
use warnings;
use diagnostics;
use Parallel::ForkManager 1.05;
use POSIX 1.30 qw(WNOHANG);
use IPC::Run 0.92 qw(start pump finish timeout harness);

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";
        },
    );
    my $lauf = 1;
    while ($lauf) {
        print "Warte auf Auftraege\n";
        if (opendir my $vh,$config->{data_pfad}) {
            foreach my $file (
                sort {(stat("$config->{data_pfad}/$a"))[9] <=> (stat("$config->{data_pfad}/$b"))[9]}
                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";
                    my ($in,$out,$err);
                    my @prog = qw(gpg2 -h);
                    my $handle = start(\@prog,\$in,\$out,\$err,10);
                    pump $handle until length $out;
                    sleep(1);
                    $forkmanager->finish($pid);
                }
                else {
                    die "Fehler, kann Sohnprozess nicht starten\n";
                }
            }
        }
        $forkmanager->wait_one_child(WNOHANG);                                                                  # sonst klappt das run_on_finish() nicht zeitnah
        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";
}

Leider scheint es sich zu "verschlucken":
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
45
46
47
48
49
50
51
52
Warte auf Auftraege
Datei 1-auftrag.dat gefunden
Sohn '-4652' startet mit Datei '1-auftrag.dat'
Datei 2-auftrag.dat gefunden
Hier meldet sich ein Sohn von der Front
Sohn '-2824' startet mit Datei '2-auftrag.dat'
Datei 3-auftrag.dat gefunden
Hier meldet sich ein Sohn von der Front
Sohn '-512' startet mit Datei '3-auftrag.dat'
Datei 4-auftrag.dat gefunden
Hier meldet sich ein Sohn von der Front
Sohn '-1200' startet mit Datei '4-auftrag.dat'
Datei 5-auftrag.dat gefunden
Hier meldet sich ein Sohn von der Front
Sohn '-5700' startet mit Datei '5-auftrag.dat'
Datei 6-auftrag.dat gefunden
Hier meldet sich ein Sohn von der Front
Sohn '-4652' ist beendet
Sohn '-4768' startet mit Datei '6-auftrag.dat'
Datei 7-auftrag.dat gefunden
Hier meldet sich ein Sohn von der Front
Sohn '-1200' ist beendet
Sohn '-3684' startet mit Datei '7-auftrag.dat'
Datei 8-auftrag.dat gefunden
Hier meldet sich ein Sohn von der Front
Uncaught exception from user code:
process ended prematurely at test_daemon.pl line 59.
IPC::Run::pump('IPC::Run=HASH(0x322c814)') called at test_daemon.pl line 59
Sohn '-2824' ist beendet
Sohn '-512' ist beendet
Sohn '-5428' startet mit Datei '8-auftrag.dat'
Datei 9-auftrag.dat gefunden
Hier meldet sich ein Sohn von der Front
Sohn '-2236' startet mit Datei '9-auftrag.dat'
Datei 10-auftrag.dat gefunden
Hier meldet sich ein Sohn von der Front
Sohn '-5700' ist beendet
Sohn '-4768' ist beendet
Sohn '-2128' startet mit Datei '10-auftrag.dat'
Datei 11-auftrag.dat gefunden
Hier meldet sich ein Sohn von der Front
Sohn '-3684' ist beendet
Sohn '-5156' startet mit Datei '11-auftrag.dat'
Datei 12-auftrag.dat gefunden
Hier meldet sich ein Sohn von der Front
Sohn '-3620' startet mit Datei '12-auftrag.dat'
Sohn '-5428' ist beendet
Hier meldet sich ein Sohn von der Front
Warte auf Auftraege
Datei 13-auftrag.dat gefunden
Sohn '-2236' ist beendet
Sohn '-5860' startet mit Datei '13-auftrag.dat'


GwenDragon: Hast du noch das System mit gpg2? Könntest du das evtl. mal bei dir laufen lassen? 20 Auftragsdateien reichen aus.

Hier noch die config.pl:
Code (perl): (dl )
1
2
3
4
5
6
7
8
#
# Config
#
{
  'max_prozesse'    => 5,       # max. Prozesse gleichzeitig
  'poll_interval'   => 1,       # Wartezeit zwischen Läufen
  'data_pfad'       => '.',     # Pfad für die Auftragsdateien
}
10 print "Hallo"
20 goto 10

View full thread Logikaufbau bei Parallel::ForkManager