1. 程式人生 > >Celery-4.1 使用者指南: Debugging

Celery-4.1 使用者指南: Debugging

遠端除錯任務(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 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 訊號傳送時,工作單元將啟動一個rdb例項。對工作單元主程序或者工作程序這都適用。

例如開啟一個工作單元:

$ CELERY_RDBSIG=1 celery worker -l info

你可以通過給任何工作單元程序傳送 USR2 訊號啟動一個 rdb 會話:

$ kill -USR2 <pid>