tasks results beat_schedule beat add_periodic_task python eclipse celery

python - results - django queue



Cómo depurar tareas Celery/Django que se ejecutan localmente en Eclipse (5)

Creo un comando de administración para probar la tarea ... me resulta más fácil que ejecutarlo desde el shell ...

Necesito depurar la tarea de apio del depurador de Eclipse. Estoy usando Eclipse, PyDev y Django.

Primero, abro mi proyecto en Eclipse y coloco un punto de interrupción al comienzo de la función de tarea.

Luego, comienzo a los trabajadores de Celery de Eclipse haciendo clic derecho en manage.py desde PyDev Package Explorer y seleccionando "Debug As-> Python Run" y especificando "celeryd -l info" como argumento. Esto inicia MainThread, Mediator y tres subprocesos más visibles desde el depurador Eclipse.

Después de eso, regreso a la vista de PyDev y comienzo la aplicación principal haciendo clic derecho en el proyecto y seleccionando Ejecutar como / PyDev: Django

Mi problema es que una vez que mytask.delay () envía la tarea, no se detiene en el punto de interrupción. Puse algunos rastros dentro del código de tareas para que pueda ver que se ejecutó en uno de los subprocesos de trabajo.

Entonces, ¿cómo hacer que el depurador de Eclipse se detenga en el punto de interrupción colocado dentro de la tarea cuando se ejecuta en el subproceso de trabajadores de Apio?


Debe considerar la opción de ejecutar la tarea de apio en el mismo hilo que el proceso principal (normalmente se ejecuta en un proceso separado), esto hará que la depuración sea mucho más fácil.

Puede decirle a apio que ejecute la tarea en sincronización agregando esta configuración a su módulo settings.py:

CELERY_ALWAYS_EAGER = True

Nota: esto solo debe utilizarse en las etapas de depuración o desarrollo.


Puedes hacerlo usando el rdb de rdb :

from celery.contrib import rdb rdb.set_trace()

Luego, en un terminal diferente, escriba telnet localhost 6900 , y obtendrá el indicador de depuración.


Si se ejecuta solo en un subproceso diferente, debería funcionar en las últimas versiones de PyDev (creo que hubo un problema antes de que un subproceso generado no se depurara, pero esto se solucionó).

Ahora, si se está iniciando en un proceso diferente, necesita usar el depurador remoto (incluso si está en la misma máquina). Consulte: http://pydev.org/manual_adv_remote_debugger.html


CELERYD_POOL defecto celery.concurrency.prefork:TaskPool que generará procesos separados para cada trabajador y PyDev no puede ver dentro de ellos. Si lo cambia a una de las opciones de subprocesos, puede usar el depurador.

Por ejemplo, para Celery 3.1 puedes usar esta configuración:

CELERYD_POOL = ''celery.concurrency.threads:TaskPool''

Tenga en cuenta que esto requiere que el módulo threadpool esté instalado.

También asegúrese de tener CELERY_ALWAYS_EAGER = False , de lo contrario, cambiar la clase de grupo no tiene sentido.