Thread Logikaufbau bei Parallel::ForkManager
(36 answers)
Opened by bianca at 2013-09-27 10:20
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 Warte auf Auftraege 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 |