🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.perl
Article #51724

Re: Thread::Queue a pusty hash na wyjsciu

#51724
From: Vava
Date: Tue, 29 Dec 2009 20:14
128 lines
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-mail
References: <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