2012-04-13 19 views
9

Tôi đang làm việc trên một dự án Perl cần hàng đợi thông báo FIFO để phân phối các tác vụ giữa một số quy trình trên một máy (UNIX). Kích thước hàng đợi có thể tăng lên đến 1 triệu công việc.Một hệ thống xếp hàng cho Perl

Tôi đã thử IPC::DirQueue, nhưng nó trở nên quá chậm với 50k hoặc nhiều công việc được cung cấp. Lựa chọn thay thế tốt cho module này có thể được sử dụng trong Perl là gì?

Trả lời

9

Tôi đã thành công khá tốt với việc sử dụng ZeroMQ cho loại sự cố này, cả với Perl và các ngôn ngữ khác.

Theo kinh nghiệm của tôi, mô-đun ZeroMQ dường như là ràng buộc đáng tin cậy nhất cho Perl hiện tại.

+0

ZeroMQ trông rất thú vị, tôi sẽ dùng thử. –

4

Tôi chưa thử nó trong các điều kiện bạn liệt kê, nhưng Thread::Queue đã chứng minh hữu ích cho tôi. Kết hợp với forks, nó có thể được sử dụng để giao tiếp với các quy trình, miễn là các quá trình đó được sinh ra bởi người tạo hàng đợi.

use forks; # If you want to use processes instead of threads. 
use Thread::Queue qw(); 

Mô hình công nhân thường lý tưởng.

my $q = Thread::Queue->new(); 

my @workers; 
for (1..$NUM_WORKERS) { 
    push @workers, async { 
     while (my $item = $q->dequeue()) { 
     ... 
     } 
    }; 
} 

# ... Enqueue requests [ $q->enqueue($request); ] ... 

# Signal termination 
$q->enqueue(undef) for [email protected]; 

# Collect workers. 
$_->join() for @workers;