Rq: Cree programáticamente más trabajadores en tiempo de ejecución

Creado en 7 abr. 2016  ·  4Comentarios  ·  Fuente: rq/rq

¿Hay alguna forma de crear más trabajadores mediante programación en tiempo de ejecución? Cuando el trabajo termina el trabajo, simplemente muere. De esta manera, puedo minimizar la cantidad de trabajos que esperan en la cola.

Comentario más útil

@shivekkhurana parece correcto.

Prefiero usar bucles for para realizar acciones (como la creación de procesos) y enumerar comprensiones para estructuras de datos. Entonces, para este caso, le sugiero que use for loop.

Todos 4 comentarios

Sí tu puedes. Pero como quieres que el trabajador muera, tendrás que empezar

  • un trabajador en ejecución de todos los tiempos usando el comando rq worker y
  • trabajadores bajo demanda guardando el siguiente código en algún archivo, digamos on_demand_workers.py y luego llame a $ python on_demand_workers.py

Idealmente, ambos comandos deben ejecutarse bajo un monitor de tareas (supervisor o circo)

#!/usr/bin/python3

import sys
import time
from rq import Connection, Worker
from redis import Redis

redis = Redis(host='localhost')

def need_burst_workers():
    # check database or redis key to determine whether burst worker army is required
    return True #boolean

def num_burst_workers_needed():
    # check the number, maybe divide the number of pending tasks by n
    return 10 #integer

def main(qs):
    with Connection(connection=redis):
        if need_burst_workers():
            [Worker(qs).work(burst=True) for i in range(num_burst_workers_needed())]
        else:
            time.sleep(10) #in seconds

if __name__ == '__main__':
    qs = sys.argv[1:] or ['default']
    main(qs)

Espero que esto ayude. Gracias.

Worker.work está bloqueando la llamada. Este código crea diez trabajadores secuencialmente. Envuelva la llamada al método de trabajo en multiprocesamiento al menos.

@ proofit404 : No me di cuenta de esto mientras respondía. Gracias por señalar esto.

El bloque __name__ == '__main__' actualizado es:

import multiprocessing

def main(qs):
    with Connection(connection=redis):
        if need_burst_workers():
            [multiprocessing.Process(target=Worker(qs).work, kwargs={'burst': True}).start() for i in range(num_burst_workers_needed())]
        else:
            time.sleep(10) #in seconds

Actualización 0:
Usando for loop en lugar de una lista de comprensión, como lo sugiere @ proofit404 :

import multiprocessing

def main(qs):
    with Connection(connection=redis):
        if need_burst_workers():
            for i in range(num_burst_workers_needed()):
                multiprocessing.Process(target=Worker(qs).work, kwargs={'burst': True}).start()
        else:
            time.sleep(10) #in seconds

Fuente: Stack Overflow

@shivekkhurana parece correcto.

Prefiero usar bucles for para realizar acciones (como la creación de procesos) y enumerar comprensiones para estructuras de datos. Entonces, para este caso, le sugiero que use for loop.

¿Fue útil esta página
0 / 5 - 0 calificaciones