2009-05-13 25 views
5

Trong python, chúng tôi có thể sử dụng các mô-đun đa xử lý. Nếu có thư viện tương tự trong Perl và Ruby, bạn có dạy nó không? Tôi sẽ đánh giá cao nếu bạn có thể bao gồm một mẫu ngắn.Vui lòng giới thiệu một thư viện đa xử lý trong Perl hoặc Ruby

+5

Chỉ cần ra khỏi tò mò, bạn đã tìm kiếm ở tất cả? –

+0

Thực sự cảm ơn bạn đã trả lời. Tôi có phải là phần mang lại kết quả tốt hơn cho một quá trình chuyên nghiệp mà đã viết ngã ba Parallel-ForkManager của chính mình? Thật phiền phức. Nó được phân tán mà không có sự cho phép nếu tôi ném một sắp xếp và chức năng xử lý dữ liệu, và làm thế nào để sử dụng cách sắp xếp kết quả trả về có thể? – freddiefujiwara

+3

Bạn có thể làm rõ nhận xét ở trên không? –

Trả lời

9

Với Perl, bạn có các tùy chọn. Một tùy chọn là sử dụng các quy trình như dưới đây. Tôi cần phải tìm cách viết chương trình tương tự bằng cách sử dụng các chủ đề nhưng http://perldoc.perl.org/perlthrtut.html sẽ cung cấp cho bạn một ý tưởng.

#!/usr/bin/perl 

use strict; 
use warnings; 

use Parallel::ForkManager; 

my @data = (0 .. 19); 

my $pm = Parallel::ForkManager->new(4); 

for my $n (@data) { 
    my $pid = $pm->start and next; 
    warn sprintf "%d^3 = %d\n", $n, slow_cube($n); 
    $pm->finish; 
} 

sub slow_cube { 
    my ($n) = @_; 

    sleep 1; 
    return $n * $n * $n; 
} 

__END__ 

Phiên bản sau đây sử dụng chủ đề không sử dụng một giới hạn về số lượng các chủ đề đã tạo (vì tôi không biết làm thế nào):

#!/usr/bin/perl 

use strict; 
use warnings; 

use threads; 

my @data = (0 .. 19); 
my @threads = map { 
    threads->new({context => 'list' }, \&slow_cube, $_) 
} @data; 

for my $thr (@threads) { 
    my ($n, $ncubed) = $thr->join; 
    print "$n^3 = $ncubed\n"; 
} 

sub slow_cube { 
    my ($n) = @_; 

    sleep 1; 
    return $n, $n * $n * $n; 
} 

__END__ 

Điều thú vị là:

TimeThis : Command Line : t.pl 
TimeThis : Elapsed Time : 00:00:01.281 
+2

Các chủ đề của Perl rất tốn kém, cả trong thời gian khởi động và bộ nhớ. Chúng được sử dụng tốt nhất trên cơ sở liên tục, không phải một lần như trên - nhưng đối với điều đó, các quy trình riêng biệt thường sẽ tốt hơn. Cú pháp Perl 6 cung cấp rất nhiều lĩnh vực để xử lý đa được sử dụng một cách tự nhiên ... một ngày nào đó. – ysth

+0

Một tùy chọn khác là sử dụng dĩa (http://search.cpan.org/~rybskej/forks-0.33/lib/forks.pm) để mô phỏng các luồng thông qua IPC thực sự khá nhanh trên các hệ thống POSIX. – jiggy

12

Ruby:

Perl:

Ngoài ra, chuỗi của Perl là chuỗi hệ điều hành gốc, vì vậy bạn có thể sử dụng chúng để tận dụng nhiều lõi.

+2

Đáng buồn thay, Python cũng là nạn nhân của GIL. –

+1

JRuby làm chủ đề tốt. Tôi chắc chắn rằng IronRuby làm chủ đề tốt. Và khi ruby ​​nhận được một máy ảo bản địa tốt hơn, họ sẽ có thể thực hiện các chủ đề tốt. – sal

+2

Tôi không nghĩ Ruby sẽ hỗ trợ các luồng hệ điều hành gốc. Matz cho biết ông đang xem xét xử lý song song thông qua một số loại "quy trình nhỏ" a la Erlang. –

3

Check-out Coro cung cấp coroutines cho Perl.

Dưới đây là một đoạn trích từ các tài liệu tác giả ....

bộ sưu tập mô-đun này quản lý continuations nói chung, thường xuyên nhất trong các hình thức của chủ đề hợp tác xã (còn gọi là coros, hoặc đơn giản là "Coro" trong tài liệu). Chúng tương tự như các luồng hạt nhân nhưng không (nói chung) chạy song song cùng một lúc ngay cả trên các máy SMP. Chủ đề cụ thể của thread được cung cấp bởi module này cũng đảm bảo rằng nó sẽ không chuyển đổi giữa các luồng trừ khi cần thiết, tại các điểm dễ xác định trong chương trình của bạn, vì vậy việc khóa và truy cập song song hiếm khi là vấn đề. các mô hình chủ đề khác.

Không giống như "chủ đề Perl" (không thực sự là chủ đề thực sự nhưng chỉ quy trình giả lập cửa sổ được chuyển sang Unix) và Coro cung cấp không gian địa chỉ dùng chung, chủ đề rất dễ dàng. Và các chủ đề của Coro cũng nhanh chóng: vô hiệu hóa mã mô phỏng quy trình Windows trong perl của bạn và sử dụng Coro có thể dễ dàng dẫn đến tăng gấp hai đến bốn lần tốc độ cho các chương trình của bạn. Một điểm chuẩn nhân ma trận song song chạy nhanh hơn 300 lần trên một lõi đơn so với các chuỗi giả của perl trên lõi tứ sử dụng tất cả bốn lõi.


Đối với một cái gì đó tương tự như trên trong Ruby sau đó có một cái nhìn tại Fiber mà đi kèm với Ruby 1.9.

Dưới đây là hai bài viết thú vị về việc sử dụng sợi quang:

Ngoài ra còn có một Fiber for Perl sử dụng Coro. Dưới đây là một số bài viết về Fiber dành cho Perl (bằng tiếng Nhật):

1

Có một cái nhìn tại trang này tóm tắt tốt đẹp cho Perl libs xử lý song song http://www.openfusion.net/perl/parallel_processing_perl_modules. Tôi thích Parallel :: Forker, một thư viện hiện đại và mạnh mẽ hơn Parallel :: ForkManager cũ và có nhiều tính năng hơn như báo hiệu quá trình con. Tôi đã sử dụng nó trong nhiều dự án và nó hoạt động chính xác như mong đợi. Dưới đây là một ví dụ về cách sử dụng nó:

#!/usr/bin/env perl 

use strict; 
use warnings; 
use Parallel::Forker; 

my $forker = Parallel::Forker->new(use_sig_child => 1, max_proc => 4); 
$SIG{CHLD} = sub { 
    Parallel::Forker::sig_child($forker); 
}; 
$SIG{TERM} = sub { 
    $forker->kill_tree_all('TERM') if $forker and $forker->in_parent; 
    die "Exiting child process...\n"; 
}; 
# an example 
for (1..10) { 
    $forker->schedule(run_on_start => sub { 
     # all child process code to run here 
    })->ready(); 
} 
# wait for all child processes to finish 
$forker->wait_all(); 

Hy vọng điều này sẽ giúp bạn

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