Thread Logikaufbau bei Parallel::ForkManager
(36 answers)
Opened by bianca at 2013-09-27 10:20
Habe das ganze mal dem Endziel näher gebracht, nämlich mit
![]() 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 Warte auf Auftraege 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 |