2

Celery では、最終的にモジュールをリロードする唯一の方法は、すべての celery プロセスを再起動することです。ワーカー ( ) をリモートでシャットダウンする方法は知っていますが、ワーカーbroadcast('shutdown', destination = [<workers>])を元に戻す方法は知りません。

新しいワーカーを含むデーモンプロセスを作成するために機能するPythonコードがありますが、セロリ内でセロリタスクとして実行しようとすると、 が表示されますAssertionError: daemonic processes are not allowed to have children。これは、ワーカープールが設定されました。

  1. Celery でこのエラーを何らかの形でオーバーライドする方法はありますか?
  2. そうでない場合、セロリに別のワーカーを起動させて自分自身を置き換える別の方法はありますか? たぶん、このすべてを bash スクリプトでラップします (ただし、Python でこれを行うポイントは、Python を使用して bash を呼び出して Python を呼び出すことを避けることでした)。
  3. そうでない場合、セロリに最新バージョンのコードをリロードするよう説得する別の方法はありますか? --autoreloadフラグと両方とも何もしbroadcast('pool_restart')ません。

動作例:

  1. 作成:

    @task def add(x,y): x+y を返す

  2. セロリをロードし、add.delay(4,4) を実行して、8 を取得します。

  3. 追加先を変更:

    @task def add(x,y): x*y を返す

  4. 魔法をかける(現在「リスタートセロリ」)

  5. add.delay(4,4) を再度実行します

16 に戻る必要があります。また、セロリをシャットダウンしてリロードしない限り、常に 8 に戻ります。これは、できればスクリプトを使用して、リモート マシンからワーカー プロセスを起動する方法がなければ、リモートでは実行できません。

4

2 に答える 2

2

Supervisord などのスーパーバイザの下で Celery デーモンを実行します。celeryd プロセスが終了すると、スーパーバイザーはそれを元に戻します。

于 2013-01-25T03:14:36.967 に答える
0

Flask を使用している場合は、サブプロセスを使用してシェル内の別のプロセスでセロリを開き、Werkzeug リローダーを使用してファイルを再起動できます。

if __name__ == "__main__":
    celery.control.broadcast("shutdown") # Kill the previous workers
    import subprocess
    subprocess.Popen("celery worker", shell=True) # Or celeryd
    app.run(use_reloader=True) # From Flask/Werkzeug

Flask/Werkzeug でリローダーを使用debug=Trueすることもできます (実稼働サーバーで行うことではありません)。watchdogパッケージを使用して変更を監視することもできます。それはどういうわけか力ずくです...しかし、うまくいきます。

于 2013-05-29T02:39:47.620 に答える