Perl从Thread :: Queue读取超时

时间:2012-07-27 07:16:04

标签: multithreading perl

我正在使用Perl中的Thread :: Queue处理老板工作人员多线程场景 老板将任务排队,工人从队列中出队 我需要实现工作人员发送下游ping消息,以防老板不通过队列发送任务x秒 不幸的是,似乎没有出现超时的出队方法 我错过了什么或者你会推荐一种不同的方法/不同的数据结构吗?

2 个答案:

答案 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”添加一些超时控制。那是:

  • 创建一些基于“yield”的循环,以便在使用时间参考来检测超时的同时从子端检查队列。
  • 使用“Thread :: Queue :: Duplex”或“Thread :: Queue :: Multiplex”模块,这些模块可能有点溢出但实现了超时控制。