什么是与perl同时连接到多个URL的最佳方式

时间:2014-09-04 06:17:42

标签: perl multitasking lwp

我有一个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);
    }
}

我不介意是否记录了响应,或者(如果是单独记录的话)。

3 个答案:

答案 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。他们在链接文档中有并发请求的示例。