我有一个perl脚本,用于检查数据库是否有内部API调用请求。
当它看到一个时,它使用LWP按要求调用API。
问题在于,有时请求可能需要一段时间才能完成,其他请求会排在后面。我正在努力找出防止这种情况的最佳方法。
脚本相对简单。我简要地看了一下POE和AnyEvent,但是找不到任何帮助我理解它们如何在这种情况下使用的教程。看起来它们主要是针对更复杂的情况而设计的。
过度简化,我的半伪代码是:
while (1) {
$url=getNextRequestFromDB();
if ($url ne "") {
$request = new HTTP::Request('GET', $url);
my $response = $ua->request($request);
logResponse($response);
}
else {
sleep(5);
}
}
我不介意是否记录了响应,或者(如果是单独记录的话)。
答案 0 :(得分:2)
LWP::Parallel CPAN模块符合您要求的要求。它需要一个URL列表(支持http,ftp和文件URL),并行连接它们,然后等待结果。
答案 1 :(得分:1)
要在perl程序中并行化长时间运行的操作,请使用fork()或线程库。
fork是一个子进程,它最初继承了所有程序状态的自己的副本,然后是独立的。每个fork都需要一个自己的DB连接。
当你在程序的PARENT副本中时,fork()返回新创建的子进程id,当你在子进程中时,它返回false。
# create 10 children
my @children;
for ( my $count = 1; $count <= 10; $count++) {
my $pid = fork();
if ($pid) {
# you are in the parent process
# print "child has $pid, parent $$\n";
push(@children, $pid);
} elsif ($pid == 0) {
# You are in the child
while (1) {
## Connect to the DB
## fetch an api request
## last if $no_request_left
## run an api request
}
## disconnect from DB
## cleanup whatever needs to be done, then exit
exit 0;
} else {
die "couldnt fork: $!\n";
}
}
foreach (@children) {
my $tmp = waitpid($_, 0);
print "pid $tmp found no more requests and exited\n";
}
print "Main ends here\n";
答案 2 :(得分:0)
看看Mojo::UserAgent。他们在链接文档中有并发请求的示例。