Отладка

Отладка задач удаленно (с помощью 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>
Вернуться на верх