Как отлаживать задачи Celery/Django, выполняемые локально в Eclipse
Мне нужно отладить задачу Celery от отладчика Eclipse.
Я использую Eclipse, PyDev и Django.
Сначала я открываю свой проект в Eclipse и помещаю точку останова в начале функции задачи.
Затем я начинаю работу с Celery рабочими из Eclipse, нажав правой кнопкой мыши на manage.py из PyDev Package Explorer и выбрав "Debug As- > Python Run" и указав в качестве аргумента "celeryd-l info". Это запустит MainThread, Mediator и еще три потока, видимые от отладчика Eclipse.
После этого я возвращаюсь к представлению PyDev и запускаю основное приложение правой кнопкой мыши по проекту и выбираю Run As/PyDev: Django
Мои проблемы в том, что как только задача будет отправлена mytask.delay(), она не останавливается на контрольной точке. Я поместил некоторые следы с кодом задач, чтобы я мог видеть, что он был выполнен в одном из рабочих потоков.
Итак, как заставить отладчика Eclipse остановиться на контрольной точке, помещенной вместе с задачей при ее выполнении в потоке рабочих Celery?
Ответы
Ответ 1
Вы должны рассмотреть возможность запуска задачи celery в том же потоке, что и основной процесс (обычно он выполняется на отдельном процессе), это значительно облегчит отладку.
Вы можете сказать, что сельдерей выполняет синхронизацию задачи, добавив этот параметр в ваш модуль settings.py:
CELERY_ALWAYS_EAGER = True
Примечание: это предназначено только для использования на этапах отладки или разработки!
Ответ 2
Вы можете сделать это, используя Celery rdb:
from celery.contrib import rdb
rdb.set_trace()
Затем в другом терминальном типе telnet localhost 6900
, и вы получите приглашение отладки.
Ответ 3
CELERYD_POOL по умолчанию имеет значение celery.concurrency.prefork:TaskPool
, в котором будут возникать отдельные процессы для каждого рабочего, а PyDev не может видеть внутри них. Если вы измените его на один из вариантов с резьбой, вы можете использовать отладчик.
Например, для Celery 3.1 вы можете использовать этот параметр:
CELERYD_POOL = 'celery.concurrency.threads:TaskPool'
Обратите внимание, что для этого требуется threadpool модуль.
Также убедитесь, что у меня есть CELERY_ALWAYS_EAGER = False
, иначе изменение класса пула не имеет смысла.
Ответ 4
Я создаю команду управления для проверки задачи. Найдите ее проще, чем запустить ее из оболочки.
Ответ 5
Если он работает только в другом потоке, он должен работать с последними версиями PyDev (я думаю, что была проблема до того, где порожденный поток не будет отлаживаться, но это было исправлено).
Теперь, если он запускается в другом процессе, вам нужно использовать удаленный отладчик (даже если он находится на том же компьютере). См.: http://pydev.org/manual_adv_remote_debugger.html