是否可以在不进行轮询的情况下监控芹菜任务的状态?监视芹菜任务状态没有轮询?
举例来说,如果我有一个任务,定期更新使用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吗? –