1

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

4

2 回答 2

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或其他错误值。

于 2012-07-27T18:29:12.537 回答
0

您的方法/结构没有任何问题,您只需要在“Thread::Queue”上添加一些超时控制。那是:

  • 创建一些基于“yield”的循环来从子端检查您的队列,同时使用时间参考来检测超时。
  • 使用“Thread::Queue::Duplex”或“Thread::Queue::Multiplex”模块,这可能有点过分,但确实实现了超时控制。
于 2012-07-27T08:34:37.590 回答