Thread Programm beschleunigen (21 answers)
Opened by steve123 at 2012-05-21 21:01

topeg
 2012-05-23 17:54
#158524 #158524
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
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":
more (12.6kb):
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.

View full thread Programm beschleunigen