Как отлаживать задачи Celery / Django, выполняемые локально в Eclipse

17

Мне нужно отладить задачу Celery от отладчика Eclipse. Я использую Eclipse, PyDev и Django.

Сначала я открываю свой проект в Eclipse и помещаю точку останова в начале функции задачи.

Затем я начинаю работу с сельдерей из Eclipse, нажав правой кнопкой мыши на manage.py из PyDev Package Explorer и выбрав «Debug As- & gt; Python Run» и указав в качестве аргумента «celeryd-l info». Это запустит MainThread, Mediator и еще три потока, видимые от отладчика Eclipse.

После этого я возвращаюсь к представлению PyDev и запускаю основное приложение правой кнопкой мыши по проекту и выбираю Run As / PyDev: Django

Мои проблемы в том, что как только задача будет отправлена ​​mytask.delay (), она не останавливается на контрольной точке. Я поместил некоторые следы с кодом задач, чтобы я мог видеть, что он был выполнен в одном из рабочих потоков.

Итак, как заставить отладчика Eclipse остановиться на контрольной точке, помещенной вместе с задачей при ее выполнении в потоке рабочих Celery?     

задан spoonboy 02.10.2012 в 22:57
источник

5 ответов

27

Вы должны рассмотреть возможность запуска задачи celery в том же потоке, что и основной процесс (обычно он выполняется на отдельном процессе), это значительно облегчит отладку.

Вы можете сказать, что сельдерей выполняет синхронизацию задачи, добавив этот параметр в ваш модуль settings.py:

CELERY_ALWAYS_EAGER = True

Примечание: это предназначено только для использования на этапах отладки или разработки!

    
ответ дан Tommaso Barbugli 03.10.2012 в 11:31
источник
9

Вы можете сделать это с помощью rdb из сельдерея:

from celery.contrib import rdb
rdb.set_trace()

Затем в другом типе терминала telnet localhost 6900 , и вы получите приглашение отладки.

    
ответ дан seddonym 18.04.2016 в 11:53
источник
4

CELERYD_POOL по умолчанию имеет значение celery.concurrency.prefork:TaskPool , которое будет создавать отдельные процессы для каждого рабочего и PyDev не может видеть внутри них. Если вы измените его на один из вариантов с резьбой, вы можете использовать отладчик.

Например, для Celery 3.1 вы можете использовать этот параметр:

CELERYD_POOL = 'celery.concurrency.threads:TaskPool'

Обратите внимание, что для этого требуется threadpool модуль.

Также убедитесь, что CELERY_ALWAYS_EAGER = False , в противном случае изменение класса пула не имеет смысла.

    
ответ дан sherbang 23.07.2013 в 22:50
источник
0

Я создаю команду управления для проверки задачи. Найдите ее проще, чем запустить ее из оболочки.

    
ответ дан eugene 15.11.2013 в 11:22
источник
-1

Если он работает только в другом потоке, он должен работать с последними версиями PyDev (я думаю, что была проблема до того, где порожденный поток не будет отлаживаться, но это было исправлено).

Теперь, если он запускается в другом процессе, вам нужно использовать удаленный отладчик (даже если он находится на том же компьютере). См .: Ссылка

    
ответ дан Fabio Zadrozny 18.10.2012 в 21:33
источник