远程调试任务(pdb)
基础
celery.contrib.rdb
是 pdb 的一个扩展版本,它支持不经过终端访问就能够远程调试进程。python
示例:shell
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
进行修改。session
默认状况下,调试器只在本机可用,要让它能够从外面访问须要设置环境变量 CELERY_RDB_HOST
。app
当工做单元执行到你的断点,它将打出日下日志信息:函数
[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:spa
$ telnet localhost 6900 Connected to localhost. Escape character is '^]'. > /opt/devel/demoapp/tasks.py(128)add() -> return result (Pdb)
键入 help 或者可用命令的列表,若是你之前没有使用过 pdb,你最好先看看python 调试文档。.net
为了说明问题,咱们读取 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
信号发送时,工做单元将启动一个rdb实例。对工做单元主进程或者工做进程这都适用。
例如开启一个工做单元:
$ CELERY_RDBSIG=1 celery worker -l info
你能够经过给任何工做单元进程发送 USR2
信号开始一个 rdb 会话:
$ kill -USR2 <pid>
转自:https://blog.csdn.net/libing_thinking/article/details/78603252