2010-08-10 27 views
5

Bazı nesnelerin bir işlevi içinde, paralel olarak çalışabilen ve benim için işleri hızlandıran birkaç kod bloğum var. ,perl'de basit paralel işleme

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 
} 

İlk ben ipler engellemek ve önceki iplik beklemek beklemek if kullanmak dikkat edin:

I (tüm bu işlevin bir bedende olduğu) şu şekilde subs::parallel kullanarak çalıştı Gerekli olduğunda bitir (daha iyi bir fikir? if oldukça çirkin ...).

İkincisi, bir hata alıyorum: Daha önce subs::parallel görülen, ama senin için iplik işlemesi tüm işi var vermediyseniz

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 
+0

İlginç. Sorun şu ki, '$ is_a_done', 'subs :: parallel' belgesinin bir yanlış kullanım/ihtarı olmak üzere iki farklı iş parçacığında kontrol edilir: * Başka bir evre/paralelleştirilmiş alt yordamları, diğer paralelleştirilmiş alt yordamlardan önceki dönüş değerlerine geçmemelisiniz. onların değerlerini okuyorlardı. * Ancak, “subs :: parallel” nin 0.8 sürümünde * açıkça * belgelenecek bir uyarı bulamadım. – pilcrow

cevap

13

ve bunu yanlış yapıyor gibi görünüyor, hata mesajına dayanarak, sanırım biraz şüpheli.

Normalde sadece bu şekilde dışarı atmayı öneriyorum, ancak yaptığınız şey, düz iş parçacığı arabirimiyle gerçekten sert değil, o zaman neden bir şans vermeyin ve sorunu basitleştirin. bit? Aynı zamanda, sorunuzun diğer kısmına bir cevap vereceğim. Eğer (iyi bir anlaşma yardımcı olacağını basitçe bir karma geçiş) bu denizaltılar dönüş değerleri kullanıyorsanız, ancak verilen kod örneğinde, sen görmezden eğer

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. 

Sen biraz daha karmaşık bir şeye ihtiyacım Onları kolaylaştıran

+0

Kod blokları kullanmak yerine daha çok alt yapı oluşturdum (çok daha temiz görünüyor) ve sorumu biraz farklı bir şekilde güncelledim - bkz. Http://stackoverflow.com/questions/3448167/basic-thread-hanlding-in-perl –