Anzeige:
Ergebnis 1 bis 12 von 12

Thema: problem mit perl threads und schleifen

  1. #1
    Registrierter Benutzer
    Registriert seit
    05.05.2004
    Beiträge
    212

    problem mit perl threads und schleifen

    hi leute,
    ich hab in perl eine funktion geschrieben
    diese möchte ich als thread starten, dies klappt auch, wenn ich mehrer zeilen zum starten des threads untereinander schreibe, starten auch mehrer threads. nun aber zu meinen problem, da ich vorher nicht weiß wieviel threads ich brauch möchte ich das in eine schleife packen, wenn ich dies mache, hab ich aber das problem, das die threads nicht gleichzeit starten sondern nacheinander und das ist genau das was ich nicht möchte.

    kann mir da jemand helfen?

    while(1){
    my thread=Thread->new( \&function );
    thread->join;
    }

    nur grob als beispiel, nicht der original code

    cu SHB

  2. #2
    Registrierter Benutzer Avatar von Caveman
    Registriert seit
    03.11.2005
    Ort
    Geilsheim
    Beiträge
    308
    Wie hast Du Dir das vorgestellt?
    Die CPU kann immer nur einen Thread bearbeiten. Zwischen diesen wird dann staendig hin und her geschalten. Das macht der Scheduler. Aber absolut gleichzeitig geht nicht. Zu mindest nicht mit einer einzigen CPU.
    Programmiere (wenn es denn mal wieder vorkommt) in C, C++, Java, Perl
    Bin kein Student (Elektrotechnik) mehr und habe die Seiten gewechselt von der Software weg hin zur Hardware

  3. #3
    Registrierter Benutzer
    Registriert seit
    05.05.2004
    Beiträge
    212
    noch nie was von threads gehört?

    wenn ich 5 threads gleichzeitg starte brauche ich für die komplette abfrage ca 30. sekunden
    lasse ich sie nacheinander laufen brauche ich 100 sekunden. also bitte nicht die frage wie ich mir das vorstelle sondern nur die antwort von leuten, die die thematik verstehen

    thx cu SHB

  4. #4
    Registrierter Benutzer
    Registriert seit
    19.08.2004
    Beiträge
    404
    Hi,

    ich kann es hier nicht testen, weil ich perl ohne threads kompiliert habe...

    Aber wenn ich mehrere threads starten wollte, würde ich ganz intuitiv so machen:

    Code:
    #!/usr/bin/perl
    
    use strict;
    use warnings;
    use Thread;
    
    my @Threads;
    for(1..10)
    {
      push(@Threads,Thread->new(\&function));
    }
    
    foreach(@Threads)
    {
      $_->join();
    }
    
    sub function()
    {
      print localtime();
      print  "\n";
      sleep(1); # zum testen ob nacheinander oder gleichzeitig...
    }


    Probiers doch mal...

    EDIT:
    Die CPU kann immer nur einen Thread bearbeiten. Zwischen diesen wird dann staendig hin und her geschalten. Das macht der Scheduler. Aber absolut gleichzeitig geht nicht. Zu mindest nicht mit einer einzigen CPU.
    Ist absolut richtig. Ich kann aber Kind Prozesse erzeugen, die dann schonmal nebenläufig existieren... der Scheduler reiht die dann alle in die Queue ein. So muss man nicht erst darauf warten, dass ein Prozess beendet wurde.
    Stell Dir vor, du willst 3 Wave Dateien mit lame in mp3's umwandeln.
    erste Möglichkeit:
    Du machst 'ne konsole auf, konvertierst das erste, dann das zweite, dann das dritte File... du musst aber jeweils warten, bis das vorherige fertig ist...
    zweite Möglichkeit:
    Du machst 3 Konsolen auf und konvertierst in jeder eine Wavedatei... (quasi gleichzeitig)

    Wer ist schneller fertig?
    Geändert von michael.sprick (31-01-2006 um 14:56 Uhr)

  5. #5
    Registrierter Benutzer
    Registriert seit
    05.05.2004
    Beiträge
    212

    Smile Looks Good

    ja das machst wie ich mirs vorstelle abgesehen davon sind nur 2 tippfehler das & und eine ) fehlt, aber passt schon, DANKE genau das was ich brauche

    bye SHB

  6. #6
    Registrierter Benutzer
    Registriert seit
    19.08.2004
    Beiträge
    404
    oops - habs korrigiert...

  7. #7
    Registrierter Benutzer Avatar von Caveman
    Registriert seit
    03.11.2005
    Ort
    Geilsheim
    Beiträge
    308
    Mir ist schon klar was Threads sind, aber ich denke wir haben in anderen Dimensionen geredet. Ich dachte mit gleichzeitig, zum absolut selben Zeitpunkt.
    War ein Denkfehler meinerseits. Egal, ich will hier keine weitere Diskussion starten.
    Programmiere (wenn es denn mal wieder vorkommt) in C, C++, Java, Perl
    Bin kein Student (Elektrotechnik) mehr und habe die Seiten gewechselt von der Software weg hin zur Hardware

  8. #8
    Registrierter Benutzer
    Registriert seit
    19.08.2004
    Beiträge
    404
    Verstehe ich gut - ich habe auch immer Probleme mit den Begrifflichkeiten, wenn über "parallel laufende Prozesse" gesprochen wird.
    Ich gehe dann eingentlich auch von SMP aus

  9. #9
    Registrierter Benutzer
    Registriert seit
    05.05.2004
    Beiträge
    212
    äh so nun hab ich doch noch ein problem ;( wenn man aus
    Code:
      push(@Threads,Thread->new(\&function));
    dies macht
    Code:
      push(@Threads,Thread->new(\&function()));
    also der funtion noch parameter übergeben, ist das alles wieder im a****, soll heißen, dass die funktionen nacheinader aufgerufen werden ;(
    hast du dafür noch ne idee?

    thx cu SHB

  10. #10
    Registrierter Benutzer
    Registriert seit
    19.08.2004
    Beiträge
    404
    \&function("parameter") gibt keine CODE Referenz zurück... da dürfte das Problem liegen. Immer schön
    Code:
    use strict;
    use warnings;
    benutzen... es sollte eigentlich eine entsprechende Warnung ausgegeben werden

    laut perldoc threads übergibst Du die Parameter aber auch anders:

    Code:
      push(@Threads, Thread->new(\&function, "Parameter 1 ", "Parameter 2","..."));
    michael

  11. #11
    Registrierter Benutzer
    Registriert seit
    05.02.2006
    Beiträge
    116
    bitte benutzt das Pragma
    Code:
    use threads;
    anstatt des alten
    Code:
    use Thread;
    und lest mal perldoc perlthrtut

  12. #12
    Registrierter Benutzer
    Registriert seit
    29.05.2002
    Ort
    Potsdam
    Beiträge
    14
    Ja, so hab ich es ja auch fast.

    meine frage ging eher in die richtung: wie komme ich an eine variable (object) in einem thread ran und kann von diesem object eine function aufrufen ?

    thx

    marcel

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •