2012-10-02 3 views
19

Ho bisogno di eseguire il debug di attività di Celery dal debugger di Eclipse. Sto usando Eclipse, PyDev e Django.Come eseguire il debug di attività di Celery/Django eseguite localmente in Eclipse

Innanzitutto, apro il mio progetto in Eclipse e inserisco un punto di interruzione all'inizio della funzione di attività.

Quindi, avvio gli operatori di Celery da Eclipse facendo clic con il tasto destro su manage.py dal PyDev Package Explorer e scegliendo "Debug As-> Python Run" e specificando "celeryd -l info" come argomento. Questo avvia MainThread, Mediator e altri tre thread visibili dal debugger di Eclipse.

Dopo di che ho tornare alla visualizzazione pydev e avviare l'applicazione principale da fare clic destro sul progetto e scegliere Esegui come/PyDev: Django

I miei problemi è che una volta che il compito è presentata dal mytask.delay() non si ferma sul punto di interruzione. Ho messo alcune tracce con il codice delle attività in modo da poter vedere che è stato eseguito in uno dei thread di lavoro.

Quindi, come fare in modo che il debugger Eclipse si fermi sul punto di interruzione immesso nell'attività quando viene eseguito nel thread di lavoro di Celery?

risposta

28

Si dovrebbe considerare l'opzione per eseguire l'attività di sedano nello stesso thread del processo principale (normalmente viene eseguito su un processo separato), questo renderà il debug molto più semplice.

Si può dire il sedano di eseguire l'operazione in sincronia con l'aggiunta di questa impostazione per il modulo settings.py:

CELERY_ALWAYS_EAGER = True 

Nota: questo è il solo scopo di essere in uso per le fasi di debug o di sviluppo!

+0

Grazie, questo risolve parzialmente il problema. Ma cosa succede se ho bisogno di eseguire il debug delle attività quando sono in esecuzione in parallelo in thread diversi? – spoonboy

+3

che dire di pdb? vedere qui http://docs.celeryproject.org/en/latest/tutorials/debugging.html –

+0

Vedete, non ho davvero bisogno di eseguire il debug in remoto. Voglio solo eseguire il debug localmente in Eclipse nel thread differente. – spoonboy

-1

Se viene eseguito solo su un thread diverso, dovrebbe funzionare sulle ultime versioni di PyDev (penso che ci fosse un problema prima in cui un thread generato non sarebbe stato debug, ma questo è stato risolto).

Ora, se si sta avviando su un processo diverso, è necessario utilizzare il debugger remoto (anche se si trova sulla stessa macchina). Vedi: http://pydev.org/manual_adv_remote_debugger.html

+0

Ancora sembra essere esattamente come descritto sopra in 2.7.3, sfortunatamente. –

5

CELERYD_POOL predefinito a celery.concurrency.prefork:TaskPool che genererà processi separati per ciascun operatore e PyDev non può vedere al loro interno. Se lo si modifica in una delle opzioni filettate, è possibile utilizzare il debugger.

Ad esempio, per Sedano 3.1 è possibile utilizzare questa impostazione:

CELERYD_POOL = 'celery.concurrency.threads:TaskPool' 

Si noti che questo richiede il modulo threadpool da installare.

Assicurarsi inoltre di avere CELERY_ALWAYS_EAGER = False, altrimenti la modifica della classe del pool non ha senso.

+0

wow, questo sembra davvero fantastico! –

0

ho creare un comando di gestione per attività di test .. trovare più facile che in esecuzione dal guscio ..

10

È possibile farlo utilizzando del Sedano rdb:

from celery.contrib import rdb 
rdb.set_trace() 

Poi, in un tipo di terminale diverso telnet localhost 6900, e riceverai il prompt di debug.

+2

o porta 6901 - seguire il messaggio nel termine di sedano –