threads join Funktion

threads join Funktion

am 09.05.2006 15:23:00 von Udo Schmitt

Hallo Leute,

könnt ihr mit eine Frage zu PERL threads beantworten (ich benutze Perl
58.7). Mein Ziel ist es, in einem script mehrere threads zu starten.
Das main script wartet darauf, bis die threads wieder beendet sind und
soll Ergebnisse auswerten.
Gibt es eine Möglichkeit, herauszufinden, welcher thread fertig ist?
Wenn ich z.B. folgenden source code habe:

$res1 =3D $thread1->join();
...
$res2 =3D $thread2->join();
...

und thread2 ist eher als thread1 fertig, so kann das main script die
Bearbeitung erst fortführen, wenn beide threads fertig sind.

Wenn es eine Abfrage gäbe, mit der man regelmäßig pollen könnte, ob
ein thread beendet ist und um welchen thread es sich handelt, so wäre
das sehr hilfreich. Als Alternative sehe ich nur, mit Dateien zu
arbeiten, die das Beendem des threads signalisieren.

Ciao

Udo

Re: threads join Funktion

am 09.05.2006 16:49:37 von news.5.maazl

Hallo,

Udo Schmitt schrieb:
> Gibt es eine Möglichkeit, herauszufinden, welcher thread fertig ist?
> Wenn ich z.B. folgenden source code habe:
>
> $res1 = $thread1->join();
> ...
> $res2 = $thread2->join();
> ...
>
> und thread2 ist eher als thread1 fertig, so kann das main script die
> Bearbeitung erst fortführen, wenn beide threads fertig sind.

Das geht so nicht.

> Wenn es eine Abfrage gäbe, mit der man regelmäßig pollen könnte, ob
> ein thread beendet ist und um welchen thread es sich handelt, so wäre
> das sehr hilfreich.

Pollen ist böse.

> Als Alternative sehe ich nur, mit Dateien zu
> arbeiten, die das Beendem des threads signalisieren.

Semaphoren gehen auch. Und damit gehen verschiedene weitere Lösungen.

1. eine Queue.
Jeder Thread, der fertig ist postet ein Objekt in eine Queue.
(evtl. mit Thread::Queue oder mit threads::shared auf eigene Faust)

2. eine Muxwait-Lösung
Wie das in perl genau geht, weiß ich aber auch nicht.

3. Thread::Pool
Vielleicht ist das grundsätzlich die bessere Lösung für das Problem.


Marcel

Re: threads join Funktion

am 09.05.2006 20:33:06 von robin

Hallo Marcel,

Hallo Marcel,
>
>Pollen ist böse.
>
>> Als Alternative sehe ich nur, mit Dateien zu
>> arbeiten, die das Beendem des threads signalisieren.
>
>Semaphoren gehen auch. Und damit gehen verschiedene weitere Lösungen.
>
>1. eine Queue.
>Jeder Thread, der fertig ist postet ein Objekt in eine Queue.
>(evtl. mit Thread::Queue oder mit threads::shared auf eigene Faust)
>
>2. eine Muxwait-Lösung
>Wie das in perl genau geht, weiß ich aber auch nicht.
>
>3. Thread::Pool
>Vielleicht ist das grundsätzlich die bessere Lösung für das Problem.
>

Da ich Active State unter Windows benutze, kann ich nur das Modul
"threads" und nicht "thread" benutzen - und semaphore und queues gibt
es da nicht (zumindest habe ich das so verstanden). Shared Variablen
kann ich verwenden - ich hoffe, der lock Mechanismus funktioniert so,
wie ich mir das vorstelle. Das werde ich morgen noch ausprobieren.

Schade, dass ich keine (blockierende) queues verwenden kann.

Ciao

Udo

Re: threads join Funktion

am 09.05.2006 20:50:31 von Oliver Block

Udo Schmitt wrote:

> Hallo Leute,
>
> Gibt es eine Möglichkeit, herauszufinden, welcher thread fertig ist?
> Wenn ich z.B. folgenden source code habe:
>
> $res1 = $thread1->join();
> ...
> $res2 = $thread2->join();
> ...

Ich weiß nicht genau wofür Du das brauchst. Eine Möglichkeit wäre z.B. eine
Ausgabe als letzte Anweisung der sub, die threads->new aufruft.

Gruss,

Oliver

Re: threads join Funktion

am 09.05.2006 20:57:45 von Udo Schmitt

Hallo Oliver,

--
>> ...
>
> Ich weiß nicht genau wofür Du das brauchst. Eine Möglichkeit wäre z.B.
> eine
> Ausgabe als letzte Anweisung der sub, die threads->new aufruft.
>

Der main thread ruft threads auf, die eine bestimmte Aufgabe erfüllen. Die
Ergebnisse der Unterthreads sammelt der Hauptthread dann wieder ein.

Ciao

Udo

>
www.123schmitt.de