Article View: pl.comp.lang.perl
Article #51724Re: Thread::Queue a pusty hash na wyjsciu
From: Vava
Date: Tue, 29 Dec 2009 20:14
Date: Tue, 29 Dec 2009 20:14
128 lines
3422 bytes
3422 bytes
Dnia 27-12-2009 o 19:31:24 Krzysztof Lewicki <menth0l@remove.this.o2.pl>
napisał(a):
> Dzięki za odpowiedzi, nieco się rozjaśniło. Jednak im dalej w las tym
> więcej drzew :) Kolejny problem z wątkami...
>
> Otóż mam dwa programy w perlu: jeden używa bezpośrednio wątków a drugi
> Thread::Pool::Simple (kod funkcji wykonywanej przez wątek pozostaje
> niezmienny). Funkcja z grubsza wyglada tak:
>
> sub foo
> {
> my $bar = oblicz_coś();
> $out_queue->enqueue($bar);
> }
>
> I teraz dziwna rzecz: w programie w którym używam jednego wątku (threads-
>> create()) kolejkę mam zadeklarowaną (w głównym programie, nie w funkcji)
> tak:
>
> my $out_queue = Thread::Queue->new();
>
> ..i to działa. Jeśli jednak zamiast pojedynczego wątku używam Pool-a (z
> referencją metody "do" na tą samą funkcję co wcześniej) to kod wątku
> dodaje wyniki do kolejki ale w głównym programie kolejka pozostaje pusta
> (po zjoinowaniu Poola) :/ Pomaga dopiero zmiana deklaracji kolejki na:
>
> our $out_queue : shared = Threads::Queue->new();
>
> Dlaczego tak się dzieje? Przyznam, że nieco się zamotałem i chciałbym
> nieco uporządkować wiedzę. Nie rozumiem dlaczego *ten sam* kod wątku
> działa różnie w zależności od tego czy używam Poola czy nie.
Nie bawiłem się nigdy Thread::Pool::Simple, ale taki kod:
#!/usr/bin/perl
use strict;
use threads;
use threads::shared;
use Thread::Queue;
use Thread::Pool::Simple;
my $QUIT : shared = 0;
my $out_queue = Thread::Queue->new();
my $l = threads->create('listener');
my $pool = Thread::Pool::Simple->new(
min => 3,
max => 5,
do => [\&foo,],
passid => 1,
);
$out_queue->enqueue("\t...TH...");
my @a;
push @a, threads->create('foo', $_) for 1..10;
$_->join for @a;
$out_queue->enqueue("\t...POOL...");
$pool->add(1) for (1..10);
$pool->join;
lock $QUIT;
$QUIT=1;
$l->join;
sub foo {
my $bar = oblicz_cos();
$out_queue->enqueue($_[0] . ": " . $bar);
}
sub oblicz_cos {
return int(rand(100))+1;
}
sub listener {
while (!$QUIT) {
if ($out_queue) {
while (my $msg = $out_queue->dequeue_nb) {
print "$msg\n";
}
}
}
}
__END__
Wydaje się działać:
[vava@valis: /home/vava/test]$ ./test.pl
...TH...
1: 30
2: 74
3: 54
4: 80
5: 43
6: 38
7: 82
9: 23
8: 50
10: 27
...POOL...
975321554: 63
587457719: 10
884075336: 13
305938673: 20
482268431: 75
479418188: 47
190195793: 62
466707656: 54
184764929: 8
1171988162: 67
Pozdrawiam
--
Vava
Wawrzyniec Żurowski
Victoria vale, et ubique es, suaviter sternutas
Technical Details
Message-ID:
<op.u5puinrcxt9k2g@ubik>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mailReferences:
<hgth64$21l6$1@news.mm.pl> <hh895s$g03$1@news.mm.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail From: Vava <vava.jedenaste.nie.spamuj@plusnet.pl> Newsgroups: pl.comp.lang.perl Subject: Re: Thread::Queue a pusty hash na wyjsciu Date: Tue, 29 Dec 2009 21:14:37 +0100 Organization: Vava Lines: 128 Message-ID: <op.u5puinrcxt9k2g@ubik> References: <hgth64$21l6$1@news.mm.pl> <hh895s$g03$1@news.mm.pl> NNTP-Posting-Host: aasn131.neoplus.adsl.tpnet.pl Mime-Version: 1.0 X-Trace: inews.gazeta.pl 1262117679 11474 83.5.225.131 (29 Dec 2009 20:14:39 GMT) X-Complaints-To: usenet@agora.pl NNTP-Posting-Date: Tue, 29 Dec 2009 20:14:39 +0000 (UTC) X-User: rosomakolak User-Agent: Opera Mail/10.10 (Win32) Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit