PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mehrere Threads mit perl...



sammy83@web.de
10-01-2002, 09:49
gibt es eine möglichkeit in perl mehrere threads parallel auszuführen? falls ja, bitte ein einfaches beispiel ;-)

Thx 4 ur answers ;-)

fork
10-01-2002, 10:59
Beispiel im Anhang

sammy83@web.de
10-01-2002, 11:09
danke für das beispiel, haste noch eine kleine erklärung, was der da wo ganz genau amcht?

fork
10-01-2002, 16:30
nö, das Dings ist schon besser als nötig dokumentiert. Wenn Du damit was anfangen willst brauchst Du ohnehin die Basics von Perl.

es gibt jede Menge Tutorials im Web

Grundsätzlich ist zu fork nur zu sagen das einen identischen Prozess durch kopieren erzeugt, der sich nur durch die Prozess-ID von den anderen unterscheidet.

Gruß
fork

Rebell
26-02-2003, 11:48
Ich brauch das Beispiel auch mal.

Ich möchte nämlich über mehrere Threads über STDIN eingeben und gleichzeitig ausdrucken können.

Rebell
27-02-2003, 10:52
Ich weiß nun wies funktioniert.
Ich weiß nur nicht wie ich einem Thread Variablen während der Laufzeit übergebe, denn angenommen
ich deklarier mir im Hauptprogramm eine Variable und starte dann den Thread, kann der Thread auf den
Wert der Variable zugreifen, aber ändere ich den Wert der Variable vom Hauptprogramm aus behält sich der Thread den alten Wert, wie kann ich den Thread als 'updaten'?

fork
27-02-2003, 17:01
Du möchtest also das sich zwei bereits gestartete Threads miteinander unterhalten?

Möglichkeiten:
- IPC (Interprocess communication)
- über TCP/IP -> Sockets
- über Dateien

Ich hab' eigentlich nur das einfachste(Das mit den Dateien) mal angerissen.

Gruß
Tobias

Rebell
27-02-2003, 17:22
Ich hab hier folgenden Quelltext gefunden, bei dem sich Threads über Queues unterhalten. Das funktioniert aber nicht.


#!/usr/bin/perl -w
use Thread;
use Thread::Queue;

$queue = Thread::Queue->new();

$producer = Thread->new(\&produce, $queue);
$consumer = Thread->new(\&consume, $queue);

$producer->join();
$consumer->join();

sub produce {
my ($queue) = @_;
foreach $i (1..10) {
$queue->enqueue($i);
print "Produced $i\n";
sleep(rand(3));
}
print "fertig\n";
}

sub consume {
my ($queue) = @_;
my $val;
do {
$val = $queue->dequeue();
print "Consumed $val\n";
} while($val != 10);
}

Rebell
28-02-2003, 11:55
Aber das hier funktioniert. Lag an der falschen (veralteten) Bilbiothek Thread anstatt threads!



#!/usr/bin/perl -w
use threads;
use Thread::Queue;

my $warteschlange = Thread::Queue->new;

$producer = threads->new(\&produce);
$consumer = threads->new(\&consume);

$producer->join();
$consumer->join();

sub produce {
while (1) {
$i++;
$warteschlange->enqueue($i);
print "Produced $i\n";
sleep(rand(3));
}

#print "fertig\n";
}

sub consume {
while (1) {
my $i = $warteschlange->dequeue;
print "Consumed $i\n";
}
}