您可以尝试使用LWP::Parallel。
更新:
我刚试图在Windows XP上使用ActiveState的5.10.1版本构建它,并遇到了许多测试失败,其中一些是由于TEST
脚本盲目地将..
添加到@INC
中的所有条目,其他一些似乎是由于与LWP::Protocol::*
类的版本不匹配。
这是一个问题。我可能会使用Parallel::ForkManager和LWP一起使用。
use strict; use warnings;
use Config::Std { def_sep => '=' };
use File::Slurp;
use HTTP::Request::Common qw(POST);
use LWP::UserAgent;
use Parallel::ForkManager;
die "No config file specified\n" unless @ARGV;
my ($ini) = @ARGV;
read_config $ini, my %config;
my $pm = Parallel::ForkManager->new(10);
my @urls = @{ $config{''}{url} };
for my $url ( @urls ) {
$pm->start and next;
my $param = [ %{ $config{$url} } ];
my $request = POST $url, $param;
my $ua = LWP::UserAgent->new;
my $fn = sprintf '%s-%s-%s.xml',
map $request->$_, qw( method uri content);
$fn =~ s/\W+/_/g;
my $response = $ua->request( $request );
if ( $response->code == 200 ) {
write_file $fn, \ $response->as_string;
}
else {
warn $response->message, "\n";
}
$pm->finish;
}
$pm->wait_all_children;
以下是示例配置文件:
url = http://one.example.com/search
url = http://two.example.com/query
url = http://three.example.com/question
[http://one.example.com/search]
keyword = Perl
limit = 20
[http://two.example.com/query]
type = Who is
limit = 10
[http://three.example.com/question]
use = Perl
result = profit
更新:
如果你需要确信执行不是串行的,请尝试以下简短的脚本:
use strict; use warnings;
use Parallel::ForkManager;
my $pm = Parallel::ForkManager->new(2);
for my $sub (1 .. 4) {
$pm->start and next;
for my $i ('a' .. 'd') {
sleep rand 3;
print "[$sub]: $i\n";
}
$pm->finish;
}
$pm->wait_all_children;
输出:
[1]:a
[1]:b
[2]:a
[1]:c
[1]:d
[2]:b
[3]:a
[3]:b
[3]:c
[2]:c
[3]:d
[2]:d
[4]:a
[4]:b
[4]:c
[4]:d
关于您对“可靠性”的评论,我认为这是错误的。您正在模拟以下脚本:
use strict; use warnings;
use Parallel::ForkManager;
use YAML;
my @responses = parallel_run();
print Dump \@responses;
sub parallel_run {
my $pm = Parallel::ForkManager->new(2);
my @responses;
for my $sub (1 .. 4) {
$pm->start and next;
for my $i ('a' .. 'd') {
sleep rand 3;
push @responses, "[$sub]: $i";
}
$pm->finish;
}
$pm->wait_all_children;
return @responses;
}
你从中得到的输出将是:
--- []
你需要自己找出原因。这就是为什么
Parallel::ForkManager
允许您注册回调函数。就像您在使用
AnyEvent::HTTP
时使用的那些一样。
你使用什么模块是你自己的事情。只是不要一直发表明显错误的声明。
fork
(最好使用Parallel::ForkManager
)进行编程,但需要注意一些细节:http://perldoc.perl.org/perlfork.html - Sinan Ünürselect
掩码处理I/O多路复用不是一件容易的事情。 - tchristfork(2)
的环境下工作。同样地,如果被迫使用古老的Perl也是如此。此外,我不知道在Cygwin下构建的Perl中使用fork是否存在任何问题。任何低于这个标准的都是无法容忍的。 - tchrist