2011-08-17 3 views
5

check_integrity라는 대기열이 있고 그 안에 많은 작업이 있습니다. 내가 그것을 위해 일하는 사람을 만나면 먼저 일자리를 먼저 얻는다. 특정 대기열의 작업을 임의로 섞을 수 있습니까? 나는 일자리를 무작위로 잡아야한다. 도와주세요.Resque 대기열에서 작업을 임의로 셔플하는 방법은 무엇입니까?

감사합니다.

+0

resque-scheduler (github.com/bvandenbos/resque-scheduler)의 지연된 작업 기능을 사용하여 구현했습니다. 임의의 시간 간격으로 대기열에 넣은 작업은 작업을 섞을 수 있습니다. 여기에 코드가 있습니다. @values ​​= (1..60) .to_a. Resque.enqueue_at (Chronic.parse ("# {rand (@values ​​[@ values.size-1])} 분 후", FetchSources, source_id). 답장을 보내 주셔서 감사합니다. –

+0

질문에 답한 후 올바른 답으로 표시하여 "답변 됨"으로 마감 처리 할 수 ​​있습니까? – rafb3

답변

1

Resque는입니다. 나는 이것이 당신이 필요로하는 것과 정확히 같아요. 당신은 원숭이 패치 resque를 괜찮다면

+0

나는 그렇게 생각하지 않는다 -이 플러그인은 큐를 랜덤 화하고 큐의 작업은 랜덤 화하지 않는다. –

+0

이 플러그인을 사용하면 작업이 아닌 대기열에 –

+0

을 추가 할 수 있습니다. –

-2

당신은 당신이 솔루션을 사용할 수 있습니다 Delayed_job

+0

질문에 대답하지 않습니다. – rafb3

0

를 사용할 수 있습니다 레일을 사용하는 경우

module Resque 

    # Monkey patch Resque to handle queues as sets instead of lists. This allows 
    # use to get jobs randomly rather then sequentially. 
    def push(queue, item) 
    watch_queue(queue) 
    redis.sadd "queue:#{queue}", encode(item) 
    end 

    def pop(queue) 
    decode redis.spop("queue:#{queue}") 
    end 

    def size(queue) 
    redis.scard("queue:#{queue}").to_i 
    end 
end 

을 그 코드로 초기화 내부의 파일을 생성하고 너는 정해질거야. 이것에 대해 갈

0

한 가지 방법은, 그들을 일괄 처리, 대기열에서 항목을 진열 한 후 배치를 셔플하고하는 것입니다 그들을 다시 삽입 :

key = "resque:queue:bulk" 
total = Redis.current.llen(key) 
batch_size = 5_000 # any value that is good enough for you 

batch = [] 
total.times do |i| 
    entry = Redis.current.lpop(key) 
    batch << entry 
    if batch.size == batch_size 
    puts "re-inserting batch..." 
    Redis.current.rpush key, batch.shuffle 
    batch = [] 
    end 
end 

를 실수로 여러 작업을 대기열에 때 정말 유용 결국 공유 자원, 잠금 장치 등을위한 경주가 끝납니다.

관련 문제