簡體   English   中英

perl中的簡單並行處理

[英]simple parallel processing in perl

我有一些代碼塊,在一些對象的函數內,可以並行運行並為我加速。

我嘗試以下列方式使用subs::parallel (所有這些都在函數體中):

my $is_a_done = parallelize { 
                              # block a, do some work
                              return 1;
                             };
my $is_b_done = parallelize { 
                              # block b, do some work
                              return 1;
                             };
my $is_c_done = parallelize { 
                              # block c depends on a so let's wait (block)
                              if ($is_a_done) {
                               # do some work
                              };
                              return 1;
                             };
my $is_d_done = parallelize { 
                              # block d, do some work
                              return 1;
                             };

if ($is_a_done && $is_b_done && $is_c_done && $is_d_done) {
 # just wait for all to finish before the function returns
}

首先,注意我使用if等待線程阻塞並等待前一個線程在需要時完成(更好的想法? if是非常難看的......)。

其次,我收到一個錯誤:

Thread already joined at /usr/local/share/perl/5.10.1/subs/parallel.pm line 259.
Perl exited with active threads:
    1 running and unjoined
    -1 finished and unjoined
    3 running and detached

我之前沒有見過subs::parallel ,但鑒於它正在為你做所有的線程處理,並且它似乎做錯了 ,根據錯誤信息,我認為這有點可疑。

通常我不會只是建議把它扔出去這樣,但你在做什么還真是不與普通螺紋接口的任何困難 ,所以為什么不給這一個鏡頭,並簡化問題一點? 與此同時,我會回答你問題的其他部分。

use threads;
my @jobs;
push @jobs, threads->create(sub {
  # do some work
});

push @jobs, threads->create(sub {
  # do some other work
});

# Repeat as necessary :)

$_->join for @jobs; # Wait for everything to finish.

如果你使用那些sub的返回值,你需要一些更復雜的東西(簡單地切換到一個散列會有很大幫助)但是在你提供的代碼示例中,你忽略了它們,這使事情變得容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM