是否可以在不進行輪詢的情況下監控芹菜任務的狀態?監視芹菜任務狀態沒有輪詢?
舉例來說,如果我有一個任務,定期更新使用update_state
它的狀態:
@task(bind=True)
def my_task(self):
for x in range(100):
time.sleep(1)
self.update_state(state='PROGRESS', meta={'x': x})
是否可以監控來自另一個進程狀態,沒有投票?
是否可以在不進行輪詢的情況下監控芹菜任務的狀態?監視芹菜任務狀態沒有輪詢?
舉例來說,如果我有一個任務,定期更新使用update_state
它的狀態:
@task(bind=True)
def my_task(self):
for x in range(100):
time.sleep(1)
self.update_state(state='PROGRESS', meta={'x': x})
是否可以監控來自另一個進程狀態,沒有投票?
我還沒有自己做過,所以這不是一個完整的答案,但我有興趣解決同樣的問題。我有三個想法值得考慮:
使用將在內置handler states像on_failure
,on_retry
,併爲你的使用情況on_success
工作?
另一個是繼承Task
(這裏簡單的例子:Callback for celery apply_async),並添加on_*
處理程序獲得通過回調函數您的自定義狀態。也許這不是必要的
最好的可能是write a custom event receiver。我認爲這就是他們的"Real-time Celery web-monitor"例子的工作原理。相關的SO貼子是:Implementing Twisted style local multiple deferred callbacks in Celery。
這取決於您的經紀人/後端。如果他們使用pub/sub,那麼你的進程將不需要輪詢任務狀態。如果他們不這樣做,那麼你需要進行輪詢(或者更普遍的是一個涉及發送消息詢問狀態的過程)。
我認爲芹菜和redis都有這種能力。
假設您想要跟蹤生產者的進度,您需要使用事件監視API。其他apis,處理程序和信號,只在工作人員中運行;所以沒有用於追蹤製作人的進度。
請查看文檔中名爲「監視和管理指南」的部分,您應該能夠幾乎逐字地運行示例代碼(對於事件接收者)。但是,它並沒有提到,也需要爲工作人員啓用事件生成。你的工作的-E參數將解決這個問題。
「進程不需要輪詢任務狀態」 - 但它將如何訪問任務狀態? –
它訂閱('pub/sub')更新 – Maximilian
但是,具體如何做到這一點? Celery會公開API嗎? –