セロリーでは、自動的にワーカーを再起動するために使用できる一連のタスクを簡単に作成できますか?セロリのワーカーを再起動するPython Celeryタスク
目標は、githubから新しいソースを取得するたびに、デプロイメントが自動的にすべての子セロリのワーカーを再起動させることです。そこで私はそのマシン上の管理セロリインスタンスにrestartWorkers()タスクを送り、そのマシン上のすべてのセロリワーカープロセスを強制終了(実際には停止)し、新しいモジュールで再起動することができました。各マシンが持っている計画がある
:
- 管理ノードを[キュー:管理、マシン固有] - マシン上の労働者の残りの部分を管理するための責任、新しいノードを立ち上げると、古い殺害必要な場合は
- ワーカーノード[キュー:gitリビジョン固有、ワーカー固有、マシン固有] - 実際に作業を行う責任があります。
実際にノードを起動します。 (shutdown_nodesはプロセスを強制終了するための正しいコードだと思われますが、私の議論が何であるべきかを理解するためにゆっくりとデバッグしています)
関数/関数restart_nodesノード)どこかで呼び出すことができるか、または私はPython内からシェルスクリプトを実行するつもりですか?
/さらに、ソースをPythonに読み込み、プロセスを強制終了して再起動するより簡単な方法はありますか?モジュールを実際に再ロードしたことがわかっていれば(実験ではそうではないと言っていますが、プロセスを再起動するまで機能の変更は反映されません)、管理ノードとの間接指示ではなく、
EDIT: ブロードキャストのおかげでシャットダウンできます(mihaelさん、ありがとうございました。担当者がいればアップします)。再起動をブロードキャストする方法はありますか? pool_restartがありますが、それはノードを強制終了しません。つまり、ソースを更新しません。
私は、Celery.bin.celerydのシーンソースのいくつかを探しています:WorkerCommand()。run()、しかし実行呼び出しの前後に何か変わったことがありますので、その関数を呼び出すだけで、クラッシュするので完了します。 Pythonスクリプトからシェルコマンドを呼び出して別のPythonスクリプトを実行するのは意味がありません。私はこれをやりたい最初の人だとは思えません。
は「pool_restartがありますが、それはそれはソースを更新しないことを意味し、ノードを殺すことはありません。」 - 本当にあなたがこれに対する解決策を持っていればいいのに、ここではまだ解決されていないように見えます。 – AlanSE
あなたの労働者をどのように管理していますか?あなたはsystemdを使っていますか? execRestartのタスクを持ち、systemctlを再起動することができます。例えば、デプロイメントの最後にcelery.serviceを再起動します。 – shalbafzadeh
その会社は4年前に下がったので、今は問題ではありません。 –