Multithreading perl中的多线程或分叉
在我的perl脚本中,我收集了大量数据,之后我需要将其发布到服务器,在这之前我很好,但我的标准是,发布到服务器需要花费大量时间,因此我需要一个线程/分叉概念,以便在发布到服务器的同时可以并行地挖掘第二个数据集 代码片段Multithreading perl中的多线程或分叉,multithreading,perl,fork,Multithreading,Perl,Fork,在我的perl脚本中,我收集了大量数据,之后我需要将其发布到服务器,在这之前我很好,但我的标准是,发布到服务器需要花费大量时间,因此我需要一个线程/分叉概念,以便在发布到服务器的同时可以并行地挖掘第二个数据集 代码片段 if(system("curl -sS $post_url --data-binary \@$filename -H 'Content-type:text/xml;charset=utf-8' 1>/dev/null") != 0) {
if(system("curl -sS $post_url --data-binary \@$filename -H 'Content-type:text/xml;charset=utf-8' 1>/dev/null") != 0)
{
exit_script(" xml: Error ","Unable to update $filename xml on $post_url");
}
有谁能告诉我,穿线或叉线是可以实现的吗 很难回答你的问题,因为这要看情况而定 是的,Perl支持分叉和线程 一般来说,我建议将线程化用于面向数据的任务,并将分叉用于几乎所有其他任务 所以你想做的事是完全可以实现的 首先,您需要:
- 将任务封装到子例程中。先让它工作起来。(这是非常重要的-并行的东西会带来痛苦,如果你不小心的话,很难排除故障-先让它单线程工作)
- 将子例程作为线程运行,并捕获它们的结果李>
use threads;
sub curl_update {
my $result = system ( "you_curl_command" );
return $result;
}
#start the async curl
my $thr = threads -> create ( \&curl_update );
#do your other stuff....
sleep ( 60 );
my $result = $thr -> join();
if ( $result ) {
#do whatever you would if the curl update failed
}
在这种情况下,join
是一个阻塞调用-主代码将停止并等待线程完成。如果你想做更复杂的事情,你可以使用非阻塞的is\u running
或is\u joinable
。我建议两者都不要
你只是说了很多HTTP。通过使用任何异步IO系统,您可以更好地谈论并发HTTP,因为它只是网络IO。Perl有很多
原则上我建议使用IO::Async
,但后来我写了它。您可以使用Net::Async::HTTP
进行HTTP命中。这将完全支持同时完成其中的许多任务——如果需要,可以执行数百或数千次
否则,您也可以尝试
POE
或AnyEvent
,两者都以各自的方式支持相同的内容。您可以使用“&”在后台执行curl。但是你需要它的pid来知道它什么时候完成以及状态如何。非常感谢,但是我错过了我的实际查询。在我的函数中,如果我找到了一个结果,我应该返回一个结果,同时如果该结果是旧的(根据我们的索引日期),我需要同时更新它,但我不希望我的控制器等到我更新它时才返回旧的结果。