首页 文章

与Coro并行运行perl子程序

提问于
浏览
1

我有一个子程序,我想与_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 回答

  • 2

    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之间分配算术,因为您的示例尝试执行此操作 .

  • 3

    Coro不会并行运行协同程序,只能异步运行 . 见文档:

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

    相反,它将在通常阻塞点的“线程”之间切换,如读,写等,但在特定时间只会运行一个“线程” .

相关问题