Thread Programm beschleunigen
(21 answers)
Opened by steve123 at 2012-05-21 21:01
Du meinst Funktionen, das sind keine "Unterprogramme". Dieser Begriff stammt noch aus einer Zeit als Programmiersprachen Funktionen nicht kannten. Da schrieb man zu jeder Funktionalität ein eigenes kleines Programm und rief es auf. So wie du den Begriff verwendest kann es zu reichlich Verwirrung kommen.
Ich vermute dir verlangt es nach "fork": 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 my @datenArray; for my $i (0..$#Dateien) { my $DateiName=$Dateien[$i]; #Wenn die Datei nicht geöffnet werden konnte mit der nächsten fortsetzen. open my $fh. '<', $DateiName or die "Error open $DateiName $!"; my $daten=do{ local $/ = undef; return <DATEI>; } close $fh; push (@datenArray, [$daten,$DateiName]); #60 Dateien in den Arbeitsspeicher einlesen und dann verarbeiten #oder wenn die letzte Datei erreicht wurde next if(@datenArray < 60 || $i != $#Dateien); #Daten aus Array holen und Eintrag löschen say "Modulo 60 oder alle Dateien" if $Debug; # wenn sich ein Kindprozess beendet, # dann die PID holen und Eintrag aus %childs löschen my %childs; local $SIG{CHLD}=sub{ my $pid=wait(); delete($childs{$pid}); }; while ( @datenArray ){ my ($DateiName,$Daten) = @{shift(@datenArray)}; # Kindprozess erzeugen; my $pid=fork; die "ERROR fork $!" unless defined $fork; # PID des Kindprozesses merken und dann nächsten Durchlauf if($pid){ $childs{$pid}=1; next; } # ab hier sind wir im Kindprozess say "Datei: $DateiName" if $Debug; my $R = Umwandeln($Daten,$DatAnz,$DateiName); InDateiSchreiben($R); # Kindprozess beenden exit; } # auf Kinder warten while(%childs){ # pause select(undef,undef,undef,0.10); # prüfen ob die Kindprozesse noch laufen # wenn nicht dann PID aus %childs löschen for(keys(%childs)) { delete($childs{$_}) unless(kill(0,$_)); } } } nebenbei den Code etwas aufgemöbelt. |