当将芹菜与Flask应用程序集成时,我有一个长期任务,需要在任务完成时回调到Flask
@celery_app.task(bind=True)
def doSth(self):
rv = long_time_job()
return rv
@task_success.connect(sender=doSth)
def on_add_success(sender, result, **kwargs):
#tell flask that a task has been done
pass
但是我不知道
一个芹菜任务是通过一个worker独立于Flask服务器运行的,它们是两个不同的进程,通过一个消息代理(rabbitmq?)进行通信。因此,当任务结束时,回调函数应该在考虑前者的情况下完成,这是两个不同的进程。
这里我给你两个解决方案:
- Webhook:在Flask服务器中定义一个HTTP URL,并在任务结束时用任务id做一个GET,这样Flask就知道了。
- Database:使用线程安全的数据库并保持任务的状态。Flask永远不会知道任务结束,直到它查询数据库(即轮询),不是实时的,但仍然是一个选项。