与Coro并行运行perl子例程



我有一个子程序,我想与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的介绍中,我读到了如何创建线程:

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};

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之间分配算术,因为它不创建任何操作系统线程。

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

它们类似于内核线程,但(通常)即使在SMP机器上也不会同时并行运行。。

相反,它将在通常的阻塞点(如读取、写入等)的"线程"之间切换,但在特定时间只有一个"线程"在运行。

相关内容

  • 没有找到相关文章

最新更新