"Threads" in Shell-Scripts

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von cmg, 07.07.2008.

  1. cmg

    cmg Mitglied

    Dabei seit:
    04.06.2008
    Beiträge:
    36
    Zustimmungen:
    0
    Hi,

    ich habe ein Bildbearbeitungs-Script. Das hat halt unmengen von converts, usw und dauert daher ewig bis es abgearbeitet ist. Die einzelnen Abschnitte könnte man theoretisch auch parallel machen. Nur ist das irgendwie möglich? Im Prinzip ists ja nichts anderes, als wenn ich ein Teil in ein anderes Script auslager und beide gleichzeitig starte... gibts da was in der Richtig?
     
  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. L0s3r

    L0s3r Tripel-As

    Dabei seit:
    22.09.2007
    Beiträge:
    216
    Zustimmungen:
    0
    Ort:
    MV
    Wie sieht das Skript denn aus?
     
  4. #3 Gott_in_schwarz, 07.07.2008
    Gott_in_schwarz

    Gott_in_schwarz ar0

    Dabei seit:
    22.04.2007
    Beiträge:
    546
    Zustimmungen:
    0
    Ort:
    Niedersachsen
    Du kannst auch einzelne Teile eines Skripts in Funktionen auslagern und diese im Hintergrund ausführen lassen:
    Code:
    function waitFoo { sleep 3; echo "foo"; }
    function bar { echo "bar"; }
    waitFoo & bar &
    Gibt dann natürlich diese "[1]+ Done"-like Meldungen. Gilt übrigens erstmal (faulerweise) nur für bash. (ksh und sh sollten das aber auch können. csh bin ich mir schon nicht mehr so sicher..)
     
  5. #4 supersucker, 08.07.2008
    supersucker

    supersucker Foren Gott

    Dabei seit:
    21.02.2005
    Beiträge:
    3.873
    Zustimmungen:
    0
    Das hat mit Threading aber nix zu tun und der Geschwindigkeitszuwachs wird um den Nullpunkt herum oszillieren.

    at cmg:

    1. Es hängt von deiner Applikation ab, ob Threading was bringt.

    2. Spielt das aber auch keine Rolle, weil die Bash keine "echtes" Threading kann.

    Wenn es nicht zuviel Aufwand ist, würde ich mir überlegen, die Script-Funktionalität in einer Hochsprache zu implementieren, die Threading kann.
     
  6. #5 Gott_in_schwarz, 08.07.2008
    Gott_in_schwarz

    Gott_in_schwarz ar0

    Dabei seit:
    22.04.2007
    Beiträge:
    546
    Zustimmungen:
    0
    Ort:
    Niedersachsen
    Ja ich weiß, war auch mehr auf diese Aussage und halt die Tatsache, dass dieser Thread in shell-Skripte-Subforum plaziert ist gemünzt:
    [slightlyOffTopic]
    Aber mich würde mal interessieren, inwiefern Threads performance-Vorteile bringen sollen. Weil das switchen zwischen verschiedenen Threads für die CPU schneller geht als zwischen verschiedenen (separaten) Prozessen? Ansonsten ist es doch eigentlich nur die Idee einen blockierenden Vorgang, der die CPU bis zu einem gewissen Grad "idlen" lässt, in mehrfacher Ausführung parallel zu starten, oder? (Zumindest ist das hier imho so gemeint.)
    Außerdem: fork() startet doch auch einen separaten Prozess (und kopiert auch noch den kompletten Speicher des Prozesses dabei). Sollte dann nicht quasi als "best practice" vom fork()en (zumindest bei rechenintensiven Applikationen) zu Gunsten von Threads abgeraten werden? (Was ich bisher so noch nicht mitbekommen habe, aber man lernt ja nie aus.)
    [/slightlyOffTopic]
     
  7. #6 supersucker, 08.07.2008
    supersucker

    supersucker Foren Gott

    Dabei seit:
    21.02.2005
    Beiträge:
    3.873
    Zustimmungen:
    0
    Bevor ich mir jetzt die Finger wund tippe - hier mal eine sehr anschauliche Erklärung aus "Java ist auch eine Insel" (gilt aber für Threading allgemeint):

    Ich hatte schon Fälle, wo ordentlich implementiertes Threading eine Leistungssteigerung von 90% ausgemacht hat.
     
  8. #7 Gott_in_schwarz, 08.07.2008
    Gott_in_schwarz

    Gott_in_schwarz ar0

    Dabei seit:
    22.04.2007
    Beiträge:
    546
    Zustimmungen:
    0
    Ort:
    Niedersachsen
    k. IMHO ist das allerdings erstmal keine Argumentation spezifisch für Threads, sondern für Multitasking. Wobei Multitasking durch Threads oder separate Prozesse erreicht werden kann. Wenn man der wikipedia glauben darf (was man selbstredend anzweifeln kann, aber ich hab jetzt grad kein Bock groß für ne OT-Diskussion zu recherchieren), sollten threads im Gegensatz zu separaten Prozessen den Kohl auch nicht Fett machen:
    von hier.
    ANYWHO, wird hier zu OT. Für das Thema können wir ja einen separaten Thread (oder Prozess *schenkelklopf*) aufmachen, oder es halt einfach an dieser Stelle sein lassen.
     
  9. #8 supersucker, 08.07.2008
    supersucker

    supersucker Foren Gott

    Dabei seit:
    21.02.2005
    Beiträge:
    3.873
    Zustimmungen:
    0
    Ich stimme zu, aber ein letzter Nachtrag sei mir noch gestattet....:devil:

    Natürlich nicht, deshalb schrieb ich ja:

    Threading will intelligent gemacht sein, sonst bringt es nix!

    So, aber nu EOOT (== end of off-topic....:) )
     
  10. cmg

    cmg Mitglied

    Dabei seit:
    04.06.2008
    Beiträge:
    36
    Zustimmungen:
    0
    Jau, das funktioniert bei mir wunderbar.
    Allerdings gibt es ein Problem.
    Ich habe eben 7 Unterfunktionen die bisher einfach nacheinander ausgeführt wurden. Dadurch war die Ausgabe natürlich auch eindeutig. Wenn ich nun alle 7 Funktionen auf einmal ausführe bekomme ich die Ausgaben die jede Funktion macht eben nicht in der Reihenfolge wie vorher, sondern durcheinander.

    Deshalb wollte ich die Ausgabe nicht direkt machen, sondern einfach nach Abarbeitung von allen 7 Funktionen alles ausgeben, damit ich wieder die Reihenfolge sichergestellt habe.

    Nur wie bekomme ich den Wert der Variablen, der in den Funktionen gesetzt wird, wieder in mein Ursprungsprogramm rein?
     
  11. #10 Gott_in_schwarz, 08.07.2008
    Gott_in_schwarz

    Gott_in_schwarz ar0

    Dabei seit:
    22.04.2007
    Beiträge:
    546
    Zustimmungen:
    0
    Ort:
    Niedersachsen
    Geht nicht direkt, da Funktionen in einer Subshell gestartet werden und man von der Elternshell nichts vom Skope der Subshell sehen kann. (Variablentechnisch)
    Du kannst allerdings am Ende der Funktion Output produzieren und den dann in der Elternshell capturen:
    Code:
    function foo { echo "foo"; }
    function bar { sleep 3; echo "bar"; }
    fooOutput="$(foo)" &
    barOutput="$(bar)" &
    Beachte, dass nun die (der/das?) Variable-Assignment im Hintergrund ausgeführt wird, nicht der Funktionsaufruf selber.
    Wenn du mehrere Variablen setzen willst, kannst du das zum Beispiel über ein Array machen:
    Code:
    function baz { echo "element1 element2 tuedelue"; }
    array=( $(baz) ) &
    echo ${array[2]} # gibt "tuedelue" aus
    Beachte hier, dass ich die Double-Quotes um $(baz) ausgelassen hab.
     
  12. #11 supersucker, 08.07.2008
    supersucker

    supersucker Foren Gott

    Dabei seit:
    21.02.2005
    Beiträge:
    3.873
    Zustimmungen:
    0
    Du hast die Diskussion nicht verstanden. Oder nicht verstehen wollen.

    Also nochmal:


    Du wirst so keinen Geschwindigkeitszuwachs feststellen können.


    Du hast 2 Möglichkeiten:

    - Dein Script optimieren (Und nein, irgendwas in den Hintergrund schieben hat damit nix zu tun)
    - Feststellen, ob Threading bei dir was bringt, und dann deine Applikation anpassen / umschreiben.

    War das jetzt deutlich genug?
     
  13. cmg

    cmg Mitglied

    Dabei seit:
    04.06.2008
    Beiträge:
    36
    Zustimmungen:
    0
    @Gott_in_schwarz: danke, werde es mal teste

    @supersucker: ich habe es selber ausprobiert und spare dadurch über 50% an Zeit ein... also kann irgendwann an deiner Theorie net stimmen.
     
  14. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  15. #13 supersucker, 08.07.2008
    supersucker

    supersucker Foren Gott

    Dabei seit:
    21.02.2005
    Beiträge:
    3.873
    Zustimmungen:
    0
    Äh, ja, das ist keine Theorie, sondern die Grundlagen der Informatik........

    Poste doch einfach mal:

    * Was du vorher gemacht hast
    * Was der derzeitige Stand ist

    und dann sehen wir weiter!

    Und wenn das hier:

    stimmen sollte, ist was an deiner Applikation falsch, nicht aber an dem Modell........
     
  16. #14 cmg, 08.07.2008
    Zuletzt bearbeitet: 11.07.2008
    cmg

    cmg Mitglied

    Dabei seit:
    04.06.2008
    Beiträge:
    36
    Zustimmungen:
    0
    fct1(){
    #30 converts und 10 vergleiche mit cmp
    }

    fct2(){
    #10 converts und 10 vergleiche mit cmp
    }

    fct3(){
    #10 converts und 10 vergleiche mit cmp
    }

    fct4(){
    #2 converts und 1 vergleiche mit cmp
    }

    fct5(){
    #30 converts und 10 vergleiche mit cmp
    }

    fct6(){
    #12 converts und 25 vergleiche mit cmp
    }

    fct7(){
    #4 converts und 10 vergleiche mit cmp
    }

    die "main" sah dann so aus:

    fct1
    fct2
    fct3
    fct4
    fct5
    fct6
    fct7

    Ausgabe von in den Funktionen fand in eine Datei statt, dat wars.



    selbe wie oben nur mit

    fct1 &
    fct2 &
    fct3 &
    fct4 &
    fct5 &
    fct6 &
    fct7 &

    Und die Ergebnisse trudeln nun je nach abgearbeiter Funktion ein. Also fct4 ist beispielsweise als erstes fertig. Ist ja auch nichts drin...


    EDIT:
    So, ich habe es nun hinbekommen. Allerdings habe ich es nicht mit dem "Output capturen" hinbekommen, zumindest nicht schneller als vorher.
    Ich habe nun die trivialste Lösung gewählt. Jede Fkt hat eine extra Output-Datei und zum schluss merge ich die einfach. Dadurch sind alle Probleme gelöst.
    Danke an alle!
     
Thema:

"Threads" in Shell-Scripts

Die Seite wird geladen...

"Threads" in Shell-Scripts - Ähnliche Themen

  1. Arbeitsspeicher von Perl Threads wieder freigeben

    Arbeitsspeicher von Perl Threads wieder freigeben: Hallo Leute, sitze an einem Problem mit Perl Threads. Ich habe ein Perl Programm geschrieben das eine Menge Threads erzeugt. Die Threads...
  2. Evolution(Newsreader) alle Threads automatisch einklappen

    Evolution(Newsreader) alle Threads automatisch einklappen: Hallo, Wie stelle ich es an, dass beim Öffnen einer Newsgroup in Evolution alle Threads eingeklappt angezeigt werden? Default ist es so, das die...
  3. Threads || Prozesse & Semaphoren

    Threads || Prozesse & Semaphoren: Hallo, ich muss für die Schule eine simulation programmieren. Es handelt um diese Problemstellung: "Simulieren sie eine Mautstelle mit zwei...
  4. Posix Threads Kommunikation über Message Queues??

    Posix Threads Kommunikation über Message Queues??: Hallo Leute, ich hätte da mal eine Frage, bei der Suche hab ich nichts finden können, und zwar soll ich eine Kommunikation zwischen Threads über...
  5. Vorschlag: Neue Benutzer und alte Threads

    Vorschlag: Neue Benutzer und alte Threads: Guten Abend, da mir in letzter Zeit unangehm auffällt, wieviele neue Benutzer Leichenschändung betreiben, frage ich mal unverbindlich nach...