2013-01-15 3 views
0

한 번에 beanstalkd 큐에서 여러 작업을 예약 할 수있는 방법이 있습니까?beanstalkd 큐에서 여러 작업 예약하기

쿼리 당 최대 10 개의 결과를 반환 할 수있는 외부 API를 요청하고 있습니다. 그들은 매일 할 수있는 요청의 수를 제한합니다. 따라서 요청 당 더 많은 결과가 나옵니다.

이 해결 방법을 사용하고 있으므로 설명서에서이 기능에 대한 언급을 찾을 수 없습니다. 누구든지 이것을 성취 할 수있는 더 좋은 방법을 알고 있습니까? 또는 아마도 beanstalkd보다 직업에 더 적합한 도구일까요?

loop do 
    sleep(0.3) 

    while @beanstalk.tubes[example].peek(:ready) 
    jobs = [] 

    catch(:done) do 
     10.times do |i| 
     if @beanstalk.tubes[example].peek(:ready) then 
      job = @beanstalk.tubes[example].reserve(0) 
      jobs << job.body 
      job.delete 
     else 
      throw(:done) 
     end 
     end 
    end 

    process(jobs) 

    end 
end 

답변

2

당신은 동시에 삭제하거나 해당 작업을 해제하기 전에 연속 reserve 여러 번 호출하여 여러 작업을 예약 할 수 있습니다.

사용자가 제공 한 코드 샘플을 기반으로, 그것은 대략 이런 식 을 볼 수 있었다 :

loop do 
    timeout = nil 
    jobs = [] 

    begin 
    10.times do |i| 
     jobs << @beanstalk.tubes[example].reserve(timeout) 
     timeout = 0 
    end 
    rescue Beaneater::TimedOutError 
    # nothing to do 
    end 

    process(jobs.map{|j| j.body}) 

    jobs.map do |job| 
    job.delete 
    end 
end 
+0

지금은 전에 PHP에서 비슷한 짓을했는지. 'reserve()'의 결과를 배열에 저장하고 모든 en-mass를 처리 한 다음 작업을 삭제합니다 (또는 성공한 작업 만 삭제할 수도 있음). 물론 KR은 Beanstalkd에 대한 진정한 전문가입니다. –

+0

신난다, 그 트릭을 않습니다. 도와 주셔서 감사합니다! – persnickety

+1

안녕하세요,이 답변을 편집하여 통화 중 대기 루프를 제거하고 첫 번째 작업에서 무기한 시간 초과로 교체하십시오. 미안해 처음으로 그걸 놓쳤다. 이 버전은보다 신속하게 작업을 처리하고 작업자 CPU를 낭비하지 않습니다. –