perl 中的多线程或分叉
multithreading or forking in perl
在我的 perl 脚本中,我正在收集大量数据,稍后我需要它 post 到服务器,到目前为止我很好,但我的标准是 post 到服务器需要随后很长一段时间,所以我需要一个线程/分叉概念,以便 post 并行地我可以在 posting 到服务器的同时挖掘我的第二个数据集。
代码片段
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_running
或 is_joinable
。
我都不建议。
您只是在谈论很多 HTTP。您可以更好地讨论并发 HTTP,因为它只是网络 IO,通过使用任何异步 IO 系统。 Perl 有很多。
原则上我会建议 IO::Async
,但后来我写了它。您可以使用 Net::Async::HTTP
进行 HTTP 命中。这将完全支持同时执行其中的许多操作 - 如果需要,可以执行数百或数千个操作。
否则,您也可以尝试 POE
或 AnyEvent
,它们将以各自的方式支持相同的事情。
在我的 perl 脚本中,我正在收集大量数据,稍后我需要它 post 到服务器,到目前为止我很好,但我的标准是 post 到服务器需要随后很长一段时间,所以我需要一个线程/分叉概念,以便 post 并行地我可以在 posting 到服务器的同时挖掘我的第二个数据集。
代码片段
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_running
或 is_joinable
。
我都不建议。
您只是在谈论很多 HTTP。您可以更好地讨论并发 HTTP,因为它只是网络 IO,通过使用任何异步 IO 系统。 Perl 有很多。
原则上我会建议 IO::Async
,但后来我写了它。您可以使用 Net::Async::HTTP
进行 HTTP 命中。这将完全支持同时执行其中的许多操作 - 如果需要,可以执行数百或数千个操作。
否则,您也可以尝试 POE
或 AnyEvent
,它们将以各自的方式支持相同的事情。