我正在使用Perl中的Thread :: Queue处理老板工作人员多线程场景 老板将任务排队,工人从队列中出队 我需要实现工作人员发送下游ping消息,以防老板不通过队列发送任务x秒 不幸的是,似乎没有出现超时的出队方法 我错过了什么或者你会推荐一种不同的方法/不同的数据结构吗?
答案 0 :(得分:1)
您可以自己添加功能,因为Thread::Queue
对象是对共享数组的祝福引用(我认为是从5.8到5.16的实现):
package Thread::Queue::TimedDequeue;
use parent 'Thread::Queue';
use threads::shared qw(lock cond_timedwait);
sub timed_dequeue {
my ($q, $patience) = @_; # XXX revert to $q->dequeue() if $patience is negative?
# $q->dequeue_nb() if $patience is zero?
my $timelimit = time() + $patience;
lock(@$q);
until (@$q) {
last if !cond_timedwait(@$q, $timelimit);
}
return shift if @$q; # We got an element
# else we timed out.
}
1;
然后你会做类似的事情:
# main.pl
use threads;
use strict; use warnings;
use Thread::Queue::TimedDequeue;
use constant WORKER_PATIENCE => 10; # 10 seconds
my $queue = Thread::Queue::TimedDequeue->new();
...
sub worker {
my $item = $queue->dequeue(WORKER_PATIENCE);
timedout() unless $item;
...
}
请注意,上述方法假设您不入队undef
或其他错误值。
答案 1 :(得分:0)
您的方法/结构没有任何问题,您只需要对“Thread :: Queue”添加一些超时控制。那是: