我正在做一个Perl项目,该项目需要一个FIFO消息队列,以便在一台机器(UNIX)上的多个进程之间分配任务。队列大小可能会增长到 1M 个作业。
我已经尝试过IPC::DirQueue
,但是随着 50k 左右的作业排队,它变得非常慢。这个模块有哪些好的替代品可以在Perl中使用?
我在使用 ZeroMQ 解决这类问题方面取得了很好的成功,无论是 Perl 还是其他语言。
根据我的经验,ZeroMQ 模块似乎是目前 Perl 最可靠的绑定。
我还没有在您列出的条件下尝试过,但是 Thread::Queue 已被证明对我有用。结合分叉,它可以用来与进程通信,只要这些进程是由队列创建者生成的。
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;