2012-04-13 88 views
9

我正在研究一個需要FIFO消息隊列的Perl項目,以便在單個機器(UNIX)上的多個進程之間分配任務。隊列大小可能會增長到1M個作業。Perl的排隊系統

我試過IPC::DirQueue,但是它變得非常慢,50k左右的工作入列。這個模塊可以在Perl中使用什麼替代方案?

回答

9

我在使用ZeroMQ解決這類問題方面取得了相當不錯的成功,包括Perl和其他語言。

根據我的經驗,ZeroMQ模塊似乎是目前Perl最可靠的綁定。

+0

ZeroMQ看起來很有趣,我會試試看。 – 2012-04-13 18:51:53

4

我沒有在你列出的條件下試過,但Thread::Queue已經證明對我有用。與forks結合使用,只要這些進程是由隊列創建者產生的,它就可以用於與進程進行通信。

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

工人模型通常是理想的。

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;