2013-01-21 12 views
6

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

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

  • 管理ノードを[キュー:管理、マシン固有] - マシン上の労働者の残りの部分を管理するための責任、新しいノードを立ち上げると、古い殺害必要な場合は
  • ワーカーノード[キュー:gitリビジョン固有、ワーカー固有、マシン固有] - 実際に作業を行う責任があります。
それはdist_packages /セロリ/ binに/ celeryd_multi.pyのどこかですが、ソースは労働者を起動するためのかなり不透明である、と私は動作するようになっていますどのように言うことができないか、それはだところ、私は必要なコードのように見える

実際にノードを起動します。 (shutdown_nodesはプロセスを強制終了するための正しいコードだと思われますが、私の議論が何であるべきかを理解するためにゆっくりとデバッグしています)

関数/関数restart_nodesノード)どこかで呼び出すことができるか、または私はPython内からシェルスクリプトを実行するつもりですか?

/さらに、ソースをPythonに読み込み、プロセスを強制終了して再起動するより簡単な方法はありますか?モジュールを実際に再ロードしたことがわかっていれば(実験ではそうではないと言っていますが、プロセスを再起動するまで機能の変更は反映されません)、管理ノードとの間接指示ではなく、

EDIT: ブロードキャストのおかげでシャットダウンできます(mihaelさん、ありがとうございました。担当者がいればアップします)。再起動をブロードキャストする方法はありますか? pool_restartがありますが、それはノードを強制終了しません。つまり、ソースを更新しません。

私は、Celery.bin.celerydのシーンソースのいくつかを探しています:WorkerCommand()。run()、しかし実行呼び出しの前後に何か変わったことがありますので、その関数を呼び出すだけで、クラッシュするので完了します。 Pythonスクリプトからシェルコマンドを呼び出して別のPythonスクリプトを実行するのは意味がありません。私はこれをやりたい最初の人だとは思えません。

+0

は「pool_restartがありますが、それはそれはソースを更新しないことを意味し、ノードを殺すことはありません。」 - 本当にあなたがこれに対する解決策を持っていればいいのに、ここではまだ解決されていないように見えます。 – AlanSE

+0

あなたの労働者をどのように管理していますか?あなたはsystemdを使っていますか? execRestartのタスクを持ち、systemctlを再起動することができます。例えば、デプロイメントの最後にcelery.serviceを再起動します。 – shalbafzadeh

+0

その会社は4年前に下がったので、今は問題ではありません。 –

答えて

2

セロリーのbroadcast functionalityを試すことができます。ここで

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

+0

途中で。シャットダウンすることはできますが、私は立ち上げることはできません。ありがとう。 –

+0

'pool_restart'メッセージは仕事をしますか?おそらくそれは新しい仕事に追いつかないだろうが、それは既存のoncesの更新を把握するだろう。 Celeryがシンボリック・タスク名を特定のコール可能オブジェクトにバインドするとき、私は100%確信していません。それがプール自体で起こるなら、それを再開すれば、私がそれを得る限り、あなたの仕事を解決するでしょう。 –

+4

タスクを定義しました。x + yを返したAdd(x、y)。セロリを始める。 'add.delay(4,4)'は8を返します。編集されたaddはx * yを返します。 'broadcast( 'pool_restart')' 'add.delay(4,4)'は16の代わりに8を返します。この動作は '--autoreload'フラグの下でも観察されます。 –

関連する問題