调试 — Python 文档

来自菜鸟教程
Celery/docs/latest/userguide/debugging
跳转至:导航、​搜索

调试

远程调试任务(使用 pdb)

基础知识

celery.contrib.rdbpdb 的扩展版本,可以远程调试没有终端访问权限的进程。

用法示例:

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 shell:

$ telnet localhost 6900
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,每当发送 SIGUSR2 信号时,worker 将打开一个 rdb 实例。 主进程和工作进程都是这种情况。

例如,以以下方式启动工作程序:

$ CELERY_RDBSIG=1 celery worker -l INFO

您可以通过执行以下命令为任何工作进程启动 rdb 会话:

$ kill -USR2 <pid>