Celery では、最終的にモジュールをリロードする唯一の方法は、すべての celery プロセスを再起動することです。ワーカー ( ) をリモートでシャットダウンする方法は知っていますが、ワーカーbroadcast('shutdown', destination = [<workers>])
を元に戻す方法は知りません。
新しいワーカーを含むデーモンプロセスを作成するために機能するPythonコードがありますが、セロリ内でセロリタスクとして実行しようとすると、 が表示されますAssertionError: daemonic processes are not allowed to have children
。これは、ワーカープールが設定されました。
- Celery でこのエラーを何らかの形でオーバーライドする方法はありますか?
- そうでない場合、セロリに別のワーカーを起動させて自分自身を置き換える別の方法はありますか? たぶん、このすべてを bash スクリプトでラップします (ただし、Python でこれを行うポイントは、Python を使用して bash を呼び出して Python を呼び出すことを避けることでした)。
- そうでない場合、セロリに最新バージョンのコードをリロードするよう説得する別の方法はありますか?
--autoreload
フラグと両方とも何もしbroadcast('pool_restart')
ません。
動作例:
作成:
@task def add(x,y): x+y を返す
セロリをロードし、add.delay(4,4) を実行して、8 を取得します。
追加先を変更:
@task def add(x,y): x*y を返す
魔法をかける(現在「リスタートセロリ」)
add.delay(4,4) を再度実行します
16 に戻る必要があります。また、セロリをシャットダウンしてリロードしない限り、常に 8 に戻ります。これは、できればスクリプトを使用して、リモート マシンからワーカー プロセスを起動する方法がなければ、リモートでは実行できません。