¿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.
Sí tu puedes. Pero como quieres que el trabajador muera, tendrás que empezar
rq worker
yon_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.
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.