デバッグ—Pythonドキュメント

提供:Dev Guides
Celery/docs/latest/userguide/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 シェルが表示されます。

$ 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

以下を実行することにより、任意のワーカープロセスのrdbセッションを開始できます。

$ kill -USR2 <pid>