Отладка¶
Отладка задач удаленно (с помощью pdb)¶
Основы¶
celery.contrib.rdb
- это расширенная версия pdb
, которая позволяет удаленно отлаживать процессы, не имеющие терминального доступа.
Пример использования:
from celery import task
from celery.contrib import rdb
@task()
def add(x, y):
result = x + y
rdb.set_trace() # <- set break-point
return result
set_trace()
устанавливает точку останова в текущем месте и создает сокет, в который можно подключиться по telnet для удаленной отладки вашей задачи.
Отладчик может быть запущен несколькими процессами одновременно, поэтому вместо использования фиксированного порта отладчик будет искать доступный порт, начиная с базового (6900 по умолчанию). Базовый порт может быть изменен с помощью переменной окружения CELERY_RDB_PORT
.
По умолчанию отладчик будет доступен только с локального хоста, чтобы разрешить доступ извне, необходимо установить переменную окружения CELERY_RDB_HOST
.
Когда работник встречает вашу точку разрыва, он регистрирует следующую информацию:
[INFO/MainProcess] Received task:
tasks.add[d7261c71-4962-47e5-b342-2448bedd20e8]
[WARNING/PoolWorker-1] Remote Debugger:6900:
Please telnet 127.0.0.1 6900. Type `exit` in session to continue.
[2011-01-18 14:25:44,119: WARNING/PoolWorker-1] Remote Debugger:6900:
Waiting for client...
Если вы подключитесь по telnet к указанному порту, перед вами откроется оболочка pdb:
$ telnet localhost 6900
Connected to localhost.
Escape character is '^]'.
> /opt/devel/demoapp/tasks.py(128)add()
-> return result
(Pdb)
Введите help
, чтобы получить список доступных команд, Возможно, будет полезно прочитать Python Debugger Manual, если вы никогда раньше не использовали pdb.
Для демонстрации мы прочитаем значение переменной result
, изменим его и продолжим выполнение задачи:
(Pdb) result
4
(Pdb) result = 'hello from rdb'
(Pdb) continue
Connection closed by foreign host.
Результат нашего вандализма можно увидеть в журналах рабочих:
[2011-01-18 14:35:36,599: INFO/MainProcess] Task
tasks.add[d7261c71-4962-47e5-b342-2448bedd20e8] succeeded
in 61.481s: 'hello from rdb'
Советы¶
Включение сигнала точки останова¶
Если переменная окружения CELERY_RDBSIG
установлена, рабочий процесс будет открывать экземпляр rdb всякий раз, когда посылается сигнал SIGUSR2. Это относится как к главному, так и к рабочему процессам.
Например, запуск рабочего с:
$ CELERY_RDBSIG=1 celery worker -l INFO
Вы можете запустить сессию rdb для любого из рабочих процессов, выполнив команду:
$ kill -USR2 <pid>