我有一个子程序,我想与_1276034并行执行:
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};
2 回答
Coro是一个合作的多任务系统 . 当程序明确地执行此操作时,或者当它被阻塞等待Coro感知调用中的事件时,线程将仅将CPU交给另一个线程 .
例如,以下内容将等待并行的HTTP响应:
由于它没有创建任何操作系统线程,Coro无法在CPU之间分配算术,因为您的示例尝试执行此操作 .
Coro不会并行运行协同程序,只能异步运行 . 见文档:
相反,它将在通常阻塞点的“线程”之间切换,如读,写等,但在特定时间只会运行一个“线程” .