我有一個名爲check_integrity的隊列和大量的作業。當我爲它運行一個工作人員時,首先需要先做好工作。是否有可能在特定隊列中洗牌?我需要這位工人隨機採取工作。請幫忙。如何在Resque隊列中洗牌作業?
謝謝。
我有一個名爲check_integrity的隊列和大量的作業。當我爲它運行一個工作人員時,首先需要先做好工作。是否有可能在特定隊列中洗牌?我需要這位工人隨機採取工作。請幫忙。如何在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