私はキューに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