2014-11-04 70 views
1

我有一個子程序,我想平行Coro執行:並行運行Perl子與科羅

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-loop中,參數mysub得到了通過,但在下面的例子中沒有?

my @letters = ("A", "B", "C", "X", "Y"); 
my @in = map { (async {mysub $_ }) } @letters; 
for (@in) {$_->join}; 
+1

[Define「does not work」,please。](http://tlp-perl.blogspot.se/2013/06/its-not-working.html) – TLP 2014-11-04 12:42:59

回答

3

Coro是一個合作多任務系統。一個線程只會在程序顯式執行時將CPU切換到另一個線程,或者在Coro識別的調用中阻塞等待事件。

例如,下面將等待HTTP響應並行:

use Coro       qw(async); 
use LWP::Protocol::AnyEvent::http qw(); 
use LWP::UserAgent    qw(); 

... 

for my $url (@urls) { 
    async { process($ua->get($url)) }; 
} 

... 

科羅是無能爲力作爲例子試圖這樣做,因爲它不會產生任何操作系統線程分割CPU之間的運算。

+0

我明白了,所以'pthreads'或'平行的叉子經理'會是要走的路嗎?或者還有其他簡單並行執行的例子嗎? – user1981275 2014-11-04 13:01:13

+0

不知道,因爲你沒有指定你想要完成的。如果是數字處理,那麼Perl可能不是您的最佳選擇,但創建線程或分叉流程可能會有所幫助。但是,P :: FM只是創建和管理流程的一種方式。 – ikegami 2014-11-04 14:48:38

2

Coro不併行運行協程,只是異步。見文檔:

...他們是相似的內核線程,但不(一般)在同一時間,即使在SMP機器並行運行..

相反,它會之間切換通常阻塞點的「線程」,如讀取,寫入等,但在特定時間只會運行一個「線程」。