run español celery_broker_url beat autodiscover_tasks python django celery django-celery

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.