Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 расставить семафор? в многопоточном приложении   Pavel Zhuk   29 Dec 2003 20:57:50 
 Re: расставить семафор? в многопоточном приложении   Yury Kopyl   30 Dec 2003 10:05:40 
Архивное /ru.perl/102779cafd734.html, оценка 3 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional