7

セロリでは、ワーカーを自動的に再起動するために使用できる (一連の) タスクを作成する簡単な方法はありますか?

目標は、github から新しいソースを取得するたびに、デプロイですべての子セロリ ワーカーを自動的に再起動させることです。そのため、そのマシン上の管理セロリ インスタンスに restartWorkers() タスクを送信して、そのマシン上のすべてのセロリ ワーカー プロセスを強制終了 (実際には stopwait) し、新しいモジュールで再起動することができます。

計画は、各マシンに次のものを持たせることです。

  • 管理ノード [キュー: 管理、マシン固有] - マシン上の残りのワーカーを管理し、必要に応じて新しいノードを立ち上げ、古いノードを強制終了します。
  • ワーカー ノード [キュー: git リビジョン固有、ワーカー固有、マシン固有] - 実際に作業を行う責任があります。

必要なコードは dist_packages/celery/bin/celeryd_multi.py のどこかにあるようですが、ワーカーを開始するためのソースはかなり不透明であり、どのように機能するのか、実際にノードを開始する場所がわかりません。( shutdown_nodes は、プロセスを強制終了するために呼び出す正しいコードのようです。引数がどうあるべきかを理解するために、ゆっくりとデバッグしています)

呼び出すことができる関数/関数 restart_nodes(self, nodes) はどこかにありますか、それとも Python 内からシェル スクリプトを実行するつもりですか?

/また、プロセスを強制終了して再起動するよりも、ソースを Python に再ロードする簡単な方法はありますか? モジュールのリロードが実際に機能することを知っていれば (実験によると、機能しないとされています。関数の変更は、プロセスを再起動するまで浸透しません)、管理ノードで間接的に行うのではなく、それを行うだけです。

編集:ブロードキャストのおかげで、シャットダウンできるようになりました(ミハエルに感謝します。担当者がもっといれば、賛成します)。再起動をブロードキャストする方法はありますか? pool_restart がありますが、それはノードを強制終了しません。つまり、ソースを更新しません。

私は celery.bin.celeryd:WorkerCommand().run() の舞台裏のソースのいくつかを調べてきましたが、実行呼び出しの前後に奇妙なことが起こっているので、それを呼び出すことはできません機能し、クラッシュするため実行されます。Pythonスクリプトからシェルコマンドを呼び出して別のPythonスクリプトを実行するのはまったく意味がありません。これをやりたいと思ったのは私が最初だとは信じられません。

4

1 に答える 1

2

Celery のブロードキャスト機能を試すことができます。

ここでいくつかの良い例を見ることができます: https://github.com/mher/flower/blob/master/flower/api/control.py

于 2013-01-22T00:26:32.653 に答える