我有一个名为check_integrity的队列,里面有很多工作。当我为它运行一个工人时,它会先按顺序执行作业。是否有可能将特定队列中的作业洗牌?我需要工人随机上班。请帮忙。
感谢。
答案 0 :(得分:1)
请看这个plugin的Resque。我想这正是你所需要的。
答案 1 :(得分:1)
解决此问题的一种方法是将条目弹出队列,对其进行批处理,对批处理进行洗牌,然后重新插入:
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
当你错误地排队几个最终竞争共享资源,锁定等的工作时,这非常有用。
答案 2 :(得分:0)
如果你不介意猴子修补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
如果使用rails,则使用该代码在初始化程序内创建一个文件,然后设置。
答案 3 :(得分:-3)