如何在Resque队列中混洗作业?

时间:2011-08-17 09:37:46

标签: ruby-on-rails ruby resque

我有一个名为check_integrity的队列,里面有很多工作。当我为它运行一个工人时,它会先按顺序执行作业。是否有可能将特定队列中的作业洗牌?我需要工人随机上班。请帮忙。

感谢。

4 个答案:

答案 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)

你可以用    Delayed_job

相关问题