2011-08-17 5 views
5

私はキューにcheck_integrityという名前のキューがあり、その中にたくさんのジョブがあります。私はそれのために労働者を実行すると、まず最初に仕事を取る順序です。その特定のキュー内のジョブをシャッフルすることは可能ですか?私は仕事を無作為に取る必要があります。助けてください。Resqueキュー内のジョブをシャッフルする方法は?

ありがとうございました。

+0

私はこれを、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)。 ご回答いただきありがとうございます。 –

+0

あなたは質問に答えて正しい答えとしてマークして、「回答済み」として閉じられますか? – rafb3

答えて

1

Resqueについてはをご覧ください。私はこれがまさにあなたが必要としているものだと思います。

+0

私はそうは思わない - このプラグインはキューをランダム化し、キューのジョブはランダム化しない。 –

+0

このプラグインを使用すると、ジョブにではなく、キューにウェイト –

+0

を追加することができます –

-2

あなたは猿のパッチ適用resqueを気にしないなら、あなたはこのソリューションを使用することができます Delayed_job

+0

これは質問に答えません – rafb3

0

を使用することができます。

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 

レールを使用している場合、そのコードを持つ初期化子内のファイルを作成し、あなたは設定されます。これについて移動する

0

一つの方法は、キューからエントリをポップそれらをバッチ処理、バッチをシャッフルしてから再挿入し、それらによって次のとおりです。

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 

誤って複数のジョブをキューに入れるとき、これは本当に便利です共有リソース、ロックなどのために競争することになります。

関連する問題