PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : problem mit perl threads und schleifen



shb
31-01-2006, 12:22
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

Caveman
31-01-2006, 14:03
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.

shb
31-01-2006, 14:07
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

michael.sprick
31-01-2006, 14:15
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:



#!/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? ;)

shb
31-01-2006, 14:40
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

michael.sprick
31-01-2006, 14:56
oops - habs korrigiert...

Caveman
31-01-2006, 15:20
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.

michael.sprick
31-01-2006, 15:50
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 :)

shb
01-02-2006, 19:46
äh so nun hab ich doch noch ein problem ;( wenn man aus

push(@Threads,Thread->new(\&function));

dies macht

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

michael.sprick
01-02-2006, 20:18
\&function("parameter") gibt keine CODE Referenz zurück... da dürfte das Problem liegen. Immer schön


use strict;
use warnings;

benutzen... es sollte eigentlich eine entsprechende Warnung ausgegeben werden ;)

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



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


michael

reneeb
05-02-2006, 08:03
bitte benutzt das Pragma
use threads; anstatt des alten
use Thread; und lest mal perldoc perlthrtut

malburg
05-02-2006, 12:41
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