Multithreading 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) {

在我的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");
        }

有谁能告诉我,穿线或叉线是可以实现的吗

很难回答你的问题,因为这要看情况而定

是的,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来知道它什么时候完成以及状态如何。非常感谢,但是我错过了我的实际查询。在我的函数中,如果我找到了一个结果,我应该返回一个结果,同时如果该结果是旧的(根据我们的索引日期),我需要同时更新它,但我不希望我的控制器等到我更新它时才返回旧的结果。