2011-08-17 9 views
5

Ho una coda di nome check_integrity e molti lavori al suo interno. Quando eseguo un worker per esso, sono necessari i primi lavori nel primo ordine. È possibile mischiare i lavori in quella particolare coda? Ho bisogno che il lavoratore prenda i lavori a caso. Per favore aiuto.Come mescolare i lavori in una coda Resque?

Grazie.

+0

L'ho implementato utilizzando la funzione lavori ritardati di resque-scheduler (github.com/bvandenbos/resque-scheduler). I lavori sono stati accolti ad intervalli di tempo casuali e sono in grado di mischiare i lavori. Ecco il codice. @values ​​= (1..60) .to_a. Resque.enqueue_at (Chronic.parse ("dopo # {rand (@values ​​[@ values.size-1])} minutes"), FetchSources, source_id). Grazie a tutti per le vostre risposte. –

+0

Puoi rispondere alla domanda e quindi contrassegnarla come risposta corretta in modo che sia chiusa come "risposta"? – rafb3

risposta

1

Guarda questo plugin per il Resque. Immagino che questo sia esattamente ciò di cui hai bisogno.

+0

Io non la penso così - questo plugin randomizza le code, non i lavori in una coda. –

+0

con questo plugin è possibile aggiungere il peso –

+0

alle code, non ai lavori –

-2

è possibile utilizzare Delayed_job

+0

Questo non risponde alla domanda – rafb3

0

Se non ti dispiace scimmia patch resque quindi è possibile utilizzare questa soluzione:

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 

Se si utilizza rotaie creare un file all'interno delle inizializzatori con quel codice e sarai impostato.

0

Un modo per andare su questo è da popping voci dalla coda, li il dosaggio fino, mischiare il lotto e poi reinserirle:

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 

Questo è molto utile quando si Enqueue erroneamente più lavori che finiscono per correre per risorse condivise, serrature e così via.

Problemi correlati