crimsonpoint

мысли вслух

четверг, ноября 06, 2008

модуль ParallelUserAgent

Неожиданно столкнулся с такой проблемой - в perl под виндой не так просто распараллелить выполнение программы, во всяком случае у меня не получилось. Форки работают не стабильно, т.е. тестовые примеры, когда в форке ни чего не делается выполняются нормально, а стоит там, к примеру создать объект lwp и все сразу вылетает. А триды у меня вообще не заработали - мой активстейтовский перл v5.6.1 говорит что не поддерживает Thread.pm. Наверное можно как-то это победить, но хотелось все сделать побыстрее, без курения манов и я полез на cpan и быстро нашел там то, что мне было нужно. Если ваша задача это получение данных из интернет то вам поможет ParallelUserAgent. Там все просто, вот например:
#!/usr/bin/perl
use strict;
use LWP::Parallel::UserAgent;

my $DEBUG=1;
my $ua = new LWP::Parallel::UserAgent;
my $req;
my $res;

$ua->in_order (0); # handle requests in order of registration
$ua->duplicates(0); # ignore duplicates
$ua->timeout (30); # in seconds
$ua->max_req (3); # max number of threads per victim site
$ua->max_hosts (3); # number of threads !!!!!!!
my %url = (
'http://crimsonpoint.blogspot.com/atom.xml'=>'atom.xml',
'http://crimsonpoint.blogspot.com/rss.xml'=>'rss2.xml',
'http://search.cpan.org/'=>'cpan.html'
);

$ua->initialize;
foreach my $i (keys %url) {
$req = new HTTP::Request GET => $i;
print "\tRegistering '".$req->url."'\n" if $DEBUG;
if ( $res = $ua->register ($req) ) {
print $res->error_as_HTML;
last;
}
}

my $entries = $ua->wait();
foreach (keys %$entries) {
$res = $entries->{$_}->response;
my $url = $res->request->url;

print "Answer for $url was \"", $res->code,": ", $res->message,"\"\n" if $DEBUG;

if( $res->is_success ) {
open(OUT, ">".$url{$url}) or die;
print OUT $res->content;
close(OUT);
}
}