我有一个子程序,我希望与Coro
并行执行:
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循环中,mysub
的参数被传递但在下面的例子中没有?
my @letters = ("A", "B", "C", "X", "Y");
my @in = map { (async {mysub $_ }) } @letters;
for ( @in ) {$_->join};
答案 0 :(得分:3)
Coro是一个合作多任务系统。当程序明确地执行此操作时,或者当它被阻塞等待在可识别Coro的调用中的事件时,线程将仅将CPU交给另一个线程。
例如,以下内容将等待并行的HTTP响应:
use Coro qw( async );
use LWP::Protocol::AnyEvent::http qw( );
use LWP::UserAgent qw( );
...
for my $url (@urls) {
async { process( $ua->get($url) ) };
}
...
Coro无法在CPU之间分配算术,因为它不会创建任何操作系统线程。
答案 1 :(得分:2)
Coro不会并行运行协同程序,只能异步运行。参见文档:
......它们与内核线程相似,但即使在SMP机器上也不会同时并行运行..
相反,它会在"线程之间切换"在通常的阻塞点,如读,写等,但只有一个"线程"在特定时间运行。