【问题标题】:Perl Reading from Thread::Queue with timeoutPerl 从 Thread::Queue 读取超时
【发布时间】:2012-07-28 02:29:12
【问题描述】:

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

【问题讨论】:

    标签: multithreading perl


    【解决方案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 或其他错误值入队。

    【讨论】:

    • 谢谢 - 这正是我想要的。也许您可以将它添加到 CPAN 包中?
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-06
      • 1970-01-01
      • 1970-01-01
      • 2020-06-21
      • 1970-01-01
      • 2016-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多