并行运行Perl子与科罗

问题描述:

我有一个子程序,我想平行Coro执行:并行运行Perl子与科罗

use strict; 
use warnings; 
use Coro; 

sub mysub { 
    my ($in) = @_; 
    print "$in \n"; 
    foreach my $i (0..100000000){ 
    $i=$i+1; 
    } 
    return 1; 
} 

Coro intro我读书,我怎么可以创建线程:

for ( 
    (async{ mysub "A" } ), 
    (async{ mysub "B" } ), 
    (async{ mysub "C" } ), 
    (async{ mysub "X" } ), 
    (async{ mysub "Y" } ) 
    ) { 
    $_->join; 
} 

但是,线程已创建,但我怎样才能并行运行它们?该示例指出Coro::Socket(或更好的AnyEvent::Socket)使并行执行成为可能,但我如何在我的简单示例中完成此项工作?

另外(但这是第二个问题),为什么在上面的for-loop中,参数mysub得到了通过,但在下面的例子中没有?

my @letters = ("A", "B", "C", "X", "Y"); 
my @in = map { (async {mysub $_ }) } @letters; 
for (@in) {$_->join}; 
+1

[Define“does not work”,please。](http://tlp-perl.blogspot.se/2013/06/its-not-working.html) – TLP 2014-11-04 12:42:59

Coro是一个合作多任务系统。一个线程只会在程序显式执行时将CPU切换到另一个线程,或者在Coro识别的调用中阻塞等待事件。

例如,下面将等待HTTP响应并行:

use Coro       qw(async); 
use LWP::Protocol::AnyEvent::http qw(); 
use LWP::UserAgent    qw(); 

... 

for my $url (@urls) { 
    async { process($ua->get($url)) }; 
} 

... 

科罗是无能为力作为例子试图这样做,因为它不会产生任何操作系统线程分割CPU之间的运算。

+0

我明白了,所以'pthreads'或'平行的叉子经理'会是要走的路吗?或者还有其他简单并行执行的例子吗? – user1981275 2014-11-04 13:01:13

+0

不知道,因为你没有指定你想要完成的。如果是数字处理,那么Perl可能不是您的最佳选择,但创建线程或分叉流程可能会有所帮助。但是,P :: FM只是创建和管理流程的一种方式。 – ikegami 2014-11-04 14:48:38

Coro不并行运行协程,只是异步。见文档:

...他们是相似的内核线程,但不(一般)在同一时间,即使在SMP机器并行运行..

相反,它会之间切换通常阻塞点的“线程”,如读取,写入等,但在特定时间只会运行一个“线程”。