9

我正在开发一个 Perl 项目,该项目需要一个 FIFO 消息队列来在单台机器(UNIX)上的多个进程之间分配任务。队列大小可能会增长到 1M 个作业。

我已经尝试过IPC::DirQueue,但是排队的工作量为 50k 左右,速度变得非常慢。可以在 Perl 中使用的这个模块有哪些好的替代品?

4

2 回答 2

9

我在使用 ZeroMQ 解决此类问题方面取得了相当大的成功,无论是使用 Perl 还是其他语言。

根据我的经验,ZeroMQ模块似乎是目前 Perl 最可靠的绑定。

于 2012-04-13T14:51:00.213 回答
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 1..@workers;

# Collect workers.
$_->join() for @workers;
于 2012-04-13T16:03:45.517 回答