繁体   English   中英

与Coro并行运行perl子例程

[英]Running perl subroutine in parallel with Coro

我有一个子例程,我想与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-aware调用中的某个事件而将其阻塞时,线程才会将其让给另一个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不会创建任何OS线程,因此无法像您的示例一样在CPU之间分配算法。

Coro不并行运行协程,而仅异步运行。 请参阅文档:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM