Подтвердить что ты не робот

Как отлаживать задачи 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?

4b9b3361

Ответ 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