在我的perl脚本中我正在收集一个大数据,后来我需要它发布到服务器,直到这个我很好,但我的标准是发布到服务器后需要很长时间所以我需要一个线程/分叉概念,以便一个人发布并平行我可以在发布到服务器的同时挖掘我的第二个数据集。
代码段
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");
}
任何人都可以告诉我这是通过线程或分叉实现的。
答案 0 :(得分:2)
很难回答你的问题,因为这取决于你的问题。
是的,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_running
或is_joinable
。
答案 1 :(得分:0)
我不建议。
你只是在说很多HTTP。您可以通过使用任何异步IO系统来更好地协调并发HTTP,因为它只是网络IO。 Perl有很多。
主要是我建议IO::Async
,但后来我写了。您可以使用Net::Async::HTTP
进行HTTP点击。这将完全支持一次完成其中许多 - 如果需要,可以有数百或数千个。
否则,您也可以尝试POE
或AnyEvent
,这两者都会以自己的方式支持相同的事情。