Spec-Zone.ru › Celery

Отладка

Удалённая отладка задач (с помощью 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:

$ telnetlocalhost6900
Connected to localhost.
Escape character is '^]'.
> /opt/devel/demoapp/tasks.py(128)add()
-> return result
(Pdb)

Введите help, чтобы получить список доступных команд. Если вы ещё не пользовались pdb, стоит ознакомиться с руководством по отладчику Python.

Для примера прочитаем значение переменной 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=1celeryworker-lINFO

Вы можете запустить сеанс rdb для любого из рабочих процессов, выполнив:

$ kill-USR2<pid>

Copyright © 2017-2026 Asif Saif Uddin, core team & contributors. All rights reserved.
Celery is licensed under The BSD License (3 Clause, also known as the new BSD license). The license is an OSI approved Open Source license and is GPL-compatible.
https://docs.celeryq.dev/en/stable/userguide/debugging.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API