|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Yury Kopyl 2:5020/400 30 Dec 2003 10:05:40 To : Pavel Zhuk Subject : Re: расставить семафор? в многопоточном приложении -------------------------------------------------------------------------------- Pavel Zhuk -> "расставить семафор? в многопоточном приложении" : PZ> Всем привет! PZ> Суть проблеммы: PZ> Есть прога которая таскает сбольшого количества URLов по маленькому PZ> кусочку. PZ> Hе спрашивайте зачем :) PZ> Юзаю её из под Windows 2000, но начал вылетать с сообщением memeory PZ> can not be read. тестил на разных машинах - всё одно и тоже, так что PZ> с памятью глюков быть не может...подозреваю, что где-то надо PZ> правильно расставить семафоры для потоков. PZ> помогите плиз. PZ> use HTTP::Request; use LWP::UserAgent; PZ> use IO::File; use threads qw(yield); судя по use threads - у тебя perl 5.8.x - а там imho не рекомендуется юзать нижеследующее: PZ> use Thread; use Thread::Semaphore; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PZ> my $output=IO::File->new("out.txt","w") or die "Cannot open output PZ> file"; PZ> $output->autoflush; PZ> my $threadnum=shift || 10; PZ> my $semaphore = new Thread::Semaphore; PZ> $flag=1; PZ> my $i : shared=0; PZ> my $prf=0; PZ> for ($j=132879;$j<200000;$j++) PZ> { PZ> if ($i<$threadnum) PZ> { PZ> $i++; PZ> (Thread->new(\&brut,$j))->detach(); PZ> } PZ> while ($i==$threadnum) PZ> { PZ> sleep(2); PZ> } PZ> } PZ> close($output); PZ> sub brut { PZ> my $num=shift; PZ> print "Entering $num\n"; PZ> my $url="http://name.domain.net/index.phtml?param=".$num; PZ> $request=HTTP::Request->new(GET,$url); PZ> my $agent=LWP::UserAgent->new; PZ> $bytes=$agent->max_size(1); PZ> my $response=$agent->request($request); PZ> my $out=$response->content; PZ> $semaphore->down; PZ> yield; PZ> $i--; PZ> print $output "$url\n $out \n"; PZ> print "Exiting $num\n"; PZ> $semaphore->up; PZ> } PZ> ЗЫ: Юзаю Perl только месяц, так что сильно ногами чур не пинать! PZ> Лучше расскажите что к чему :) PZ> Заранее спасибо. у меня все сделано через fork'и (которые суть thread под виндой), а вся инфа сливается по pipe в родительский процесс - где все спокойно записывается куда надо. Yury Kopyl aka hrg | http://id.totem.ru | "мы не пьем - мы лечимся..." --- ifmail v.2.15dev5.1 * Origin: IAC Samara-Internet, Ltd. (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/102779cafd734.html, оценка из 5, голосов 10
|