2012-07-27 3 views
1

나는 Thread :: Queue in Perl로 보스 워킹 크루 멀티 스레드 시나리오에서 일하고있다.
보스가 작업을 대기열에 추가하고 작업자가 대기열에서 대기열에서 대기열에 있습니다.
작업자가 대기열을 통해 x 초 동안 작업을 보내지 않을 경우 작업자가 다운 스트림 ping 메시지를 보내도록해야합니다.
시간 초과가있는 대기열에서 삭제하는 방법이없는 것 같습니다.
내가 놓친 것이 있습니까? 아니면 다른 접근 방식/다른 데이터 구조를 권장 하시겠습니까?Perl 스레드에서 읽기 :: 타임 아웃으로 큐

답변

1

당신은 Thread::Queue 객체 (I가 5.16 통해 5.8에서 구현이라고 생각) 공유 배열에 대한 축복 참조는 것을 알고, 기능성 자신을 추가 할 수 있습니다 위의 방법은 당신이하지 대기열 undef 또는 그렇지 않은 경우는 false 값 을 가정합니다

# 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; 
    ... 
} 

참고 : 그런 짓을.

+0

고마워요. -이게 내가 찾고있는 것입니다. 어쩌면 이것을 CPAN 패키지에 추가 할 수 있습니까? – weismat

0

접근 방식/구조에 아무런 문제가 없으므로 "Thread :: Queue"에 대한 일부 시간 제한 컨트롤을 추가하기 만하면됩니다. 그 중 하나는 다음과 같습니다.

  • 시간 기준을 사용하여 시간 초과를 감지하는 동안 자식 측에서 대기열을 확인하기위한 "수익률"기반 루프를 만듭니다.
  • 은 "Thread :: Queue :: Duplex"또는 "Thread :: Queue :: Multiplex"모듈을 사용합니다.이 모듈은 비트 오버 일지라도 시간 초과 컨트롤을 구현합니다.

    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; 
    

    하면 좋겠 그런 :

관련 문제