2010-08-10 44 views
5

Tôi có một vài khối mã, bên trong một hàm của một số đối tượng, có thể chạy song song và tăng tốc độ cho tôi.xử lý song song đơn giản trong perl

tôi đã cố gắng sử dụng subs::parallel theo cách sau (tất cả điều này là trong một cơ thể của một hàm):

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 
} 

Đầu tiên, hãy chú ý tôi sử dụng if chờ bài để chặn và chờ cho thread trước để kết thúc khi cần thiết (một ý tưởng tốt hơn? if là khá xấu xí ...).

Thứ hai, tôi nhận được một lỗi:

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

Thú vị. Vấn đề là '$ is_a_done' được kiểm tra trong hai luồng khác nhau, đó là một sự lạm dụng/báo trước của' subs :: parallel': * Bạn không nên chuyển sang một chuỗi con/song song khác các giá trị trả về trước đó từ các chương trình con song song khác mà không đọc các giá trị của chúng. * Tôi thừa nhận rằng tôi không thấy báo trước được * rõ ràng * được ghi lại trong phiên bản 0.8 của 'subs :: parallel', tuy nhiên. – pilcrow

Trả lời

13

Tôi chưa thấy subs::parallel trước đó, nhưng cho rằng nó đang làm tất cả các xử lý cho bạn chủ đề, và nó dường như được làm việc đó sai, dựa trên thông báo lỗi, tôi nghĩ rằng đó là một chút nghi ngờ.

Thông thường tôi sẽ không chỉ đề nghị ném nó ra như thế, nhưng những gì bạn đang làm thực sự không phải là bất kỳ khó với giao diện chủ đề đơn giản, vậy tại sao không cho rằng một shot, và đơn giản hóa vấn đề một bit? Đồng thời, tôi sẽ trả lời bạn cho phần khác của câu hỏi của bạn.

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. 

Bạn cần một chút phức tạp hơn nếu bạn đang sử dụng giá trị trả về từ những người đăng ký đó (chỉ cần chuyển sang băm sẽ giúp ích) nhưng trong mẫu mã bạn đã cung cấp, bạn đang bỏ qua chúng, làm cho mọi việc trở nên dễ dàng.

+0

Tôi đã tạo các đăng ký thay vì sử dụng các khối mã (trông gọn gàng hơn nhiều) và cập nhật câu hỏi của tôi thành một câu hỏi hơi khác - vui lòng xem http://stackoverflow.com/questions/3448167/basic-thread-hanlding-in-perl –

Các vấn đề liên quan