perl中的多线程或分叉

时间:2015-01-19 05:29:55

标签: 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)
        {
            exit_script(" xml: Error ","Unable to update $filename xml on $post_url");
        }

任何人都可以告诉我这是通过线程或分叉实现的。

2 个答案:

答案 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_runningis_joinable

答案 1 :(得分:0)

我不建议。

你只是在说很多HTTP。您可以通过使用任何异步IO系统来更好地协调并发HTTP,因为它只是网络IO。 Perl有很多。

主要是我建议IO::Async,但后来我写了。您可以使用Net::Async::HTTP进行HTTP点击。这将完全支持一次完成其中许多 - 如果需要,可以有数百或数千个。

否则,您也可以尝试POEAnyEvent,这两者都会以自己的方式支持相同的事情。