2012-10-02 12 views
19

Potrzebuję debugować zadanie Celery z debugera Eclipse. Używam Eclipse, PyDev i Django.Jak debugować zadania Celery/Django działające lokalnie w środowisku Eclipse

pierwsze, otwieram mój projekt w Eclipse i umieścić punkt przerwania na początku funkcji zadań.

Następnie uruchamiam pracowników firmy Selector od Eclipse, klikając prawym przyciskiem myszy na manage.py z Eksploratora pakietów PyDev i wybierając "Debuguj jako -> Python Run" i podając jako argument "celeryd -l info". To uruchamia MainThread, Mediator i trzy kolejne wątki widoczne z debugera Eclipse.

Potem wrócić do widoku PyDev i rozpocząć stosowanie przez główny prawym przyciskiem myszy na projekcie i wybierając Run As/PyDev: Django

Moi zagadnienia jest to, że gdy zadanie jest składany przez mytask.delay() nie zatrzymuje się na punkcie przerwania. Umieściłem kilka śladów za pomocą kodu zadań, więc widzę, że zostało wykonane w jednym z wątków roboczych.

Co zrobić, aby debugger Eclipse zatrzymał się na punkcie przerwania umieszczonym przy wykonywaniu zadania w wątku pracowników selera?

Odpowiedz

28

Powinieneś rozważyć opcję uruchomienia zadania selera w tym samym wątku co proces główny (zwykle działa on w oddzielnym procesie), co znacznie ułatwia debugowanie.

Można powiedzieć, seler, aby uruchomić zadanie synchronizacji poprzez dodanie tego ustawienia do modułu settings.py:

CELERY_ALWAYS_EAGER = True 

Uwaga: To jest przeznaczona tylko do być używany do debugowania lub rozwojowych etapach!

+0

Dzięki, częściowo rozwiązuje problem. Ale co, jeśli muszę debugować zadania, gdy działają one równolegle w różnych wątkach? – spoonboy

+3

co z pdb? zobacz tutaj http://docs.celeryproject.org/en/latest/tutorials/debugging.html –

+0

Nie muszę go zdalnie debugować. Chcę po prostu debugować lokalnie w Eclipse w innym wątku. – spoonboy

-1

Jeśli działa tylko w innym wątku, powinien działać na najnowszych wersjach PyDev (wydaje mi się, że był problem przed miejscem, w którym zrodzony wątek nie byłby debugowany, ale zostało to naprawione).

Teraz, jeśli uruchamia się na innym procesie, należy użyć zdalnego debuggera (nawet jeśli jest na tym samym komputerze). Zobacz: http://pydev.org/manual_adv_remote_debugger.html

+0

Nadal wydaje się, niestety, dokładnie takie, jak opisano powyżej w 2.7.3. –

5

CELERYD_POOL domyślnie celery.concurrency.prefork:TaskPool, który odradza oddzielne procesy dla każdego pracownika, a PyDev nie widzi w nich. Jeśli zmienisz go na jedną z opcji gwintowanych, możesz użyć debuggera.

Na przykład dla Seler 3.1 można użyć tego ustawienia:

CELERYD_POOL = 'celery.concurrency.threads:TaskPool' 

pamiętać, że wymaga to moduł threadpool zostać zainstalowany.

Upewnij się także, aby mieć CELERY_ALWAYS_EAGER = False, inaczej zmieniając klasa basen nie ma sensu.

+0

Wow, wydaje się to całkiem niesamowite! –

0

utworzyć polecenie zarządzania do zadania testowego .. łatwiej niż uruchomienie go z muszli ..

10

Można to zrobić przy użyciu Seler na rdb:

from celery.contrib import rdb 
rdb.set_trace() 

Następnie w innego typu terminala telnet localhost 6900, a otrzymasz komunikat debugowania.

+2

lub port 6901 - postępuj zgodnie z wiadomością w terminie selera –

Powiązane problemy