2013-01-21 98 views
6

在芹菜,是否有一種簡單的方法來創建一系列的任務,我可以用來自動重啓一個工人?Python芹菜任務重新啓動芹菜工

目標是讓我的部署在每次從github獲得新源時自動重啓所有子芹菜工作者。因此,我可以發出一個restartWorkers()任務給該機器上的管理芹菜實例,該實例會殺死(實際上停止)該機器上的所有芹菜工作進程,並使用新模塊重新啓動它們。

該計劃是爲每臺機器有:

  • 管理節點[隊列:管理,機專用] - 負責管理機器上的工人的休息,帶來了新的節點和殺害老需要的人
  • 工作節點[隊列:特定於git修訂版本,特定於工作人員,機器特定] - 實際負責完成此工作。

它看起來像我需要的代碼是介於dist_packages /芹菜/斌/ celeryd_multi.py,但源是相當不透明的啓動工人,我不能告訴它是如何工作的或者它的實際啓動節點。 (它看起來像shutdown_nodes是正在調用的殺死進程的代碼,我正在慢慢調試我的方式來弄清楚我的論據應該是什麼)

是否有函數/函數restart_nodes(self,節點)的地方,我可以打電話,或者我會從python內運行shell腳本?

/另外,是否有更簡單的方法來重新加載到Python比殺死和重新啓動進程?如果我知道重新加載模塊實際上是工作的(實驗說它不是。函數的改變不會滲透,直到我重新啓動過程),我只是這樣做,而不是管理節點間接。

編輯: 感謝廣播,我現在可以關閉(謝謝你,如果我有更多的代表,我會upvote)。任何方式來播放重新啓動?有pool_restart,但是不殺死節點,這意味着它不會更新源。我一直在尋找一些celery.bin.celeryd中的幕後源代碼:WorkerCommand()。run(),但是在運行調用之前和之後會有一些奇怪的事情發生,所以我可以'只需調用該函數即可完成工作,因爲它崩潰了。從python腳本中調用一個shell命令來運行另一個python腳本只是有意義的,我不能相信我是第一個想要這樣做的人。

+0

「有pool_restart,但這並不能殺死節點,這意味着它不會更新源」 - 真的希望你有這個解決方案,但看起來它在這裏仍然沒有解決。 – AlanSE

+0

你如何管理你的工人?你在使用systemd嗎?你可以有一個execRestart任務,並調用systemctl restart celery.service,例如在部署結束時 – shalbafzadeh

+0

這家公司在4年前還沒有開始,所以現在沒關係,我忘記了。 –

回答

2

您可以嘗試使用芹菜的broadcast functionality

在這裏你可以看到一些很好的例子:https://github.com/mher/flower/blob/master/flower/api/control.py

+0

中途有。我可以關機,但我無法提出。謝謝。 –

+0

'pool_restart'消息是否會完成這項工作?可能它不會趕上新的任務,但它會掌握現有技能的更新。 Celery將符號任務名稱綁定到特定的可調用函數時,我並不是100%確定的。如果它發生在游泳池本身,那麼重新啓動它會解決你的任務,就我所知。 –

+4

不是。定義了返回x + y的任務Add(x,y)。開始了芹菜。 'add.delay(4,4)'返回8.編輯添加返回x * y。 '廣播( 'pool_restart')'。 'add.delay(4,4)'仍然返回8而不是16.請注意,這種行爲也在'--autoreload'標誌下被觀察到。 –