check_integrity라는 대기열이 있고 그 안에 많은 작업이 있습니다. 내가 그것을 위해 일하는 사람을 만나면 먼저 일자리를 먼저 얻는다. 특정 대기열의 작업을 임의로 섞을 수 있습니까? 나는 일자리를 무작위로 잡아야한다. 도와주세요.Resque 대기열에서 작업을 임의로 셔플하는 방법은 무엇입니까?
감사합니다.
check_integrity라는 대기열이 있고 그 안에 많은 작업이 있습니다. 내가 그것을 위해 일하는 사람을 만나면 먼저 일자리를 먼저 얻는다. 특정 대기열의 작업을 임의로 섞을 수 있습니까? 나는 일자리를 무작위로 잡아야한다. 도와주세요.Resque 대기열에서 작업을 임의로 셔플하는 방법은 무엇입니까?
감사합니다.
Resque는입니다. 나는 이것이 당신이 필요로하는 것과 정확히 같아요. 당신은 원숭이 패치 resque를 괜찮다면
나는 그렇게 생각하지 않는다 -이 플러그인은 큐를 랜덤 화하고 큐의 작업은 랜덤 화하지 않는다. –
이 플러그인을 사용하면 작업이 아닌 대기열에 –
을 추가 할 수 있습니다. –
를 사용할 수 있습니다 레일을 사용하는 경우
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
을 그 코드로 초기화 내부의 파일을 생성하고 너는 정해질거야. 이것에 대해 갈
한 가지 방법은, 그들을 일괄 처리, 대기열에서 항목을 진열 한 후 배치를 셔플하고하는 것입니다 그들을 다시 삽입 :
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
를 실수로 여러 작업을 대기열에 때 정말 유용 결국 공유 자원, 잠금 장치 등을위한 경주가 끝납니다.
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). 답장을 보내 주셔서 감사합니다. –
질문에 답한 후 올바른 답으로 표시하여 "답변 됨"으로 마감 처리 할 수 있습니까? – rafb3