Arbeitsspeicher von Perl Threads wieder freigeben

Dieses Thema im Forum "Ruby, php, Perl, Python ..." wurde erstellt von aktiv, 16.07.2012.

  1. aktiv

    aktiv Grünschnabel

    Dabei seit:
    16.07.2012
    Beiträge:
    3
    Zustimmungen:
    0
    Hallo Leute,

    sitze an einem Problem mit Perl Threads.
    Ich habe ein Perl Programm geschrieben das eine Menge Threads erzeugt. Die Threads werden alle nacheinander abgearbeitet, soweit sogut...

    Das Problem liegt nun darin, das jeder Thread sich automatisch ca. 8MB Arbeitsspeicher gönnt und diesen nach dem Durchlauf auch nicht wieder freigibt.
    Dh -> mit jedem neuen Thread + 8MB Arbeitsspeicher sind dann schon nach ca 200 Threads 1600Mb...

    hier einamal der Beispielhafte Programmcode
    Code:
    #!/usr/bin/perl
    
    use threads;
    use threads::shared;
    
    foreach my $inArbeit(1...200)
    {
       my $t = threads->new(\&threadMain, $inArbeit);
    
    }
    
    sub threadMain {
    
    #...
    	return 1;
    }
    
    
    Nachdem ein Thread durchlaufen ist soll nun der gesamte Speicher dieses Threads wieder freigegeben werden. Dies klappt aber irgendwie nicht. Hab da schon verschiedene Sachen ausprobiert gegooglet usw....
    Das Problem wird öfters angeschnitten, aber adequate Lösungen gibt es nciht. Oder ich bin zu doof dazu:)

    Die DESTROY Funktion soll woll ein Weg sein, aber wo die hinsoll ist mir ein Rätsel.
    oder einfach sowas
    Code:
    undef $t;
    geht auch nicht:(

    Vielleicht hat ja einer eine Idee...

    Grüße an alle!
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 bitmuncher, 16.07.2012
    bitmuncher

    bitmuncher Der Stillgelegte

    Dabei seit:
    08.05.2007
    Beiträge:
    3.171
    Zustimmungen:
    0
    Du wirst vermutlich nicht drumrum kommen jede Variable im Thread explizit freizugeben bevor er zum Elternprozess zurückkehrt.
     
  4. aktiv

    aktiv Grünschnabel

    Dabei seit:
    16.07.2012
    Beiträge:
    3
    Zustimmungen:
    0
    Moin danke für die Antwort, wenn du damit meinst das ich es 'joinen' soll, dann hast du verdammt recht, jetzt gehts nämlich wie gewünscht.
    Eine Kleinigkeit hat große Wirkung:
    In meinem Gesamten Programm wird nun ein Speicher von 0,1% verwendet. Vorher warens ca 13%.
    Wenn ichs richtig verstehe, dann wartet jetzt explizit aufs Ende des Thread und beendet ihn dann sauber.
     
  5. #4 bitmuncher, 16.07.2012
    Zuletzt bearbeitet: 16.07.2012
    bitmuncher

    bitmuncher Der Stillgelegte

    Dabei seit:
    08.05.2007
    Beiträge:
    3.171
    Zustimmungen:
    0
    Daran hatte ich gar nicht gedacht. Der Return-Wert muss ja auch abgeholt werden, sonst wartet der Thread auf den Eltern-Prozess, da er noch an diesen gebunden ist. Das logische Verhalten wäre, dass der Thread erst zerstört wird, wenn der Eltern-Prozess den Return-Wert abgefragt hat, weil dieser mit der Zerstörung des Threads sonst auch weg wäre. Vermutlich würde ein detach() es auch tun, wenn man den Rückgabewert nicht braucht.
     
  6. aktiv

    aktiv Grünschnabel

    Dabei seit:
    16.07.2012
    Beiträge:
    3
    Zustimmungen:
    0
    Moinsen, hier nochmal abschließend die Lösung zu meinem Problem.

    So in etwa funktioniert das. (Ist ungetestet zur Illustration ;)) Mit 'is_joinable()' kann man abfragen ob ein Thread beendet ist. Falls ein Thread beendet ist kann er mit 'join()' beendet werden. In diesem Moment wird der Speicher wieder freigegeben.
    Nutzt man 'join()' kann man einen Rückgabewert mit übergeben. Z.B. '$rueckgabe = $t->join();'.
    Nutzt man 'detach()' wie von bitmuncher vorgeschlagen, dann wird der Thread automatisch beendet wenn er durch ist. Ein Rückgabewert an den Aufrufer gibts da nicht.

    Vielleicht hilft dieser Post dem Ein oder Anderen :)
    Greetz & THX an bitmuncher
     
Thema: Arbeitsspeicher von Perl Threads wieder freigeben
Besucher kamen mit folgenden Suchen
  1. perl speicher freigeben

Die Seite wird geladen...

Arbeitsspeicher von Perl Threads wieder freigeben - Ähnliche Themen

  1. Vramfs - neues Dateisystem im Arbeitsspeicher der Grafikkarte

    Vramfs - neues Dateisystem im Arbeitsspeicher der Grafikkarte: Ein neues Dateisystem will im Stil einer Ramdisk den Arbeitsspeicher auf Grafikkarten zur vorübergehenden Datenspeicherung nutzen. Vramfs setzt...
  2. Max Arbeitsspeicher

    Max Arbeitsspeicher: Hallo, ich habe dieses Motherboard im Betrieb, und würde gier gerne den Arbeitsspeicher auf 4x4GB ausbauen. Nun steht in der Beschreibung: 4 x...
  3. Arbeitsspeicher Upgrade

    Arbeitsspeicher Upgrade: Hallo, ich hoffe ich bin hier im richtigen Thread. Ich habe eine Frage bezüglich eines Ram Upgrades, und zwar besitze ich einen vserver auf XEN...
  4. Weniger Arbeitsspeicher angezeigt als vorhanden.

    Weniger Arbeitsspeicher angezeigt als vorhanden.: Hallo, ich habe mir einen neuen Rechner zusammengebastelt und nun 2x2GB Speicherriegel reingesteckt (Kingston, FSB 800 MHz). Da ich Grafik...
  5. SUSE 10.0 und der Arbeitsspeicher...

    SUSE 10.0 und der Arbeitsspeicher...: :hilfe2: Hallo ersma,bis jetzt hab ich nur zugeschaut,aber jetzt hab ich selbst ein Problem! Wollte mein RAM auf 1GB vergrössern,aber der...