EclipseデバッガーからCeleryタスクをデバッグする必要があります。私はEclipse、PyDev、Djangoを使用しています。
まず、Eclipseでプロジェクトを開き、タスク関数の先頭にブレークポイントを設定します。
次に、PyDevパッケージエクスプローラーからmanage.pyを右クリックし、[Debug As]-> [Python Run]を選択し、引数として「celeryd -l info」を指定して、EclipseからCeleryワーカーを起動します。これにより、MainThread、Mediator、およびEclipseデバッガーから表示される3つのスレッドが開始されます。
その後、PyDevビューに戻り、プロジェクトを右クリックして[実行]/[PyDev:Django]を選択してメインアプリケーションを起動します。
私の問題は、タスクがmytask.delay()によって送信されると、ブレークポイントで停止しないことです。タスクコードにいくつかのトレースを入れて、ワーカースレッドの1つで実行されたことを確認します。
では、Eclipseデバッガーを、Celeryワーカースレッドで実行されたときにタスクとともに配置されたブレークポイントで停止させるにはどうすればよいでしょうか。
セロリタスクをメインプロセスと同じスレッドで実行するオプションを検討する必要があります(通常は別のプロセスで実行されます)。これにより、デバッグがはるかに簡単になります。
この設定をsettings.pyモジュールに追加することで、タスクを同期して実行するようにceleryに指示できます。
CELERY_ALWAYS_EAGER = True
注:これは、デバッグまたは開発段階でのみ使用することを目的としています。
セロリの rdb を使用してそれを行うことができます:
from celery.contrib import rdb
rdb.set_trace()
次に、別の端末でtelnet localhost 6900
、そしてあなたはデバッグプロンプトを得るでしょう。
CELERYD_POOL デフォルトはcelery.concurrency.prefork:TaskPool
これはワーカーごとに個別のプロセスを生成し、PyDevはその内部を見ることができません。スレッドオプションの1つに変更すると、デバッガーを使用できます。
たとえば、Celery 3.1の場合、次の設定を使用できます。
CELERYD_POOL = 'celery.concurrency.threads:TaskPool'
threadpool モジュールをインストールする必要があることに注意してください。
また、必ずCELERY_ALWAYS_EAGER = False
、そうでなければプールクラスを変更しても意味がありません。
タスクをテストするための管理コマンドを作成します。シェルから実行するよりも簡単です。