2011-08-17 11 views
5

Tengo una cola llamada check_integrity y muchos trabajos en ella. Cuando ejecuto a un trabajador para ello, primero se requieren trabajos en primer orden. ¿Es posible mezclar los trabajos en esa cola en particular? Necesito que el trabajador acepte trabajos al azar. Por favor ayuda.¿Cómo mezclar trabajos en una cola Resque?

Gracias.

+0

he implementado con estas características utilizando empleos retraso de resque-planificador (github.com/bvandenbos/resque-scheduler). Los trabajos se pusieron en cola a intervalos de tiempo aleatorios y pude barajar trabajos. Aquí está el código. @values ​​= (1..60) .to_a. Resque.enqueue_at (Chronic.parse ("after # {rand (@values ​​[@ values.size-1])} minutes"), FetchSources, source_id). Gracias a todos por sus respuestas. –

+0

¿Puedes responder la pregunta y luego marcarla como la respuesta correcta para que se cierre como "respondida"? – rafb3

Respuesta

1

Mira esta plugin para la Resque. Supongo que esto es exactamente lo que necesitas.

+0

No lo creo, este complemento aleatoriza las colas, no los trabajos en una cola. –

+0

con este plugin se puede añadir peso a –

+0

colas, no trabajos –

0

Si no le importa mono parches resque continuación, puede utilizar esta solución:

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 

Si están utilizando los carriles crear un archivo dentro de los inicializadores con ese código y estarás listo.

0

Una forma de hacerlo es haciendo estallar las entradas de la cola, procesamiento por lotes para arriba, arrastrando el lote y luego volver a insertarlos:

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 

Esto es muy útil cuando, por error, encolar varias ofertas de empleo eso termina compitiendo por recursos compartidos, bloqueos, etc.

Cuestiones relacionadas