python - español - Crear tareas de apio y luego ejecutarse sincrónicamente.
django celery rabbitmq (2)
Si desea disparar cada llamada una tras otra, ¿por qué no envuelve todas las llamadas en una sola tarea?
@task
def make_a_lot_of_calls(numbers):
for num in numbers:
# Assuming that reminder blocks till the call finishes
reminder(number)
def make_calls(request):
make_a_lot_of_calls.delay(phone_numers)
return redirect(''live_call_updates'')
Mi aplicación reúne un montón de números de teléfono en una página. Una vez que el usuario presiona el botón Enviar, creo una tarea de apio para llamar a cada número y dar un mensaje recordatorio, luego redirigirlos a una página donde pueden ver las actualizaciones en vivo sobre la llamada. Estoy utilizando sockets web para actualizar en vivo el estado de cada llamada y necesito las tareas para ejecutar de forma síncrona, ya que solo tengo acceso para marcar desde un número.
Así que una vez que se complete la primera llamada / tarea, quiero que la siguiente se dispare.
CELERY_ALWAYS_EAGER un vistazo a la configuración de CELERY_ALWAYS_EAGER pero simplemente pasó por la primera iteración y se detuvo.
@task
def reminder(number):
# CODE THAT CALLS NUMBER HERE....
def make_calls(request):
for number in phone_numbers:
reminder.delay(number)
return redirect(''live_call_updates'')
Si observa el DOCS de apio en las tareas , ve que para llamar a una tarea sincrónicamente, usa el método apply () en lugar del método apply_async ().
Así que en tu caso podrías usar:
reminder.apply(args=[number])
El DOCS también nota que:
If the CELERY_ALWAYS_EAGER setting is set, it will be replaced by a local apply() call instead.
Gracias a @JivanAmara que en los comentarios reiteró que al usar apply (), la tarea se ejecutará localmente (en el servidor / computadora en la que se llama). Y esto puede tener ramificaciones, si pretendía ejecutar sus tareas en múltiples servidores / máquinas.