并行运行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};
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之间的运算。
我明白了,所以'pthreads'或'平行的叉子经理'会是要走的路吗?或者还有其他简单并行执行的例子吗? – user1981275 2014-11-04 13:01:13
不知道,因为你没有指定你想要完成的。如果是数字处理,那么Perl可能不是您的最佳选择,但创建线程或分叉流程可能会有所帮助。但是,P :: FM只是创建和管理流程的一种方式。 – ikegami 2014-11-04 14:48:38
Coro不并行运行协程,只是异步。见文档:
...他们是相似的内核线程,但不(一般)在同一时间,即使在SMP机器并行运行..
相反,它会之间切换通常阻塞点的“线程”,如读取,写入等,但在特定时间只会运行一个“线程”。
[Define“does not work”,please。](http://tlp-perl.blogspot.se/2013/06/its-not-working.html) – TLP 2014-11-04 12:42:59