我收到了一个不寻常的要求:必须使用芹菜与数据库层进行通信。
应用程序在后端使用Flask和MongoDB,在前端使用Angular。
赞助商认为我可以解雇任务,让其中一名工作人员将数据移入/移出Mongo并获得结果。
据我所知,如果我同步调用芹菜任务(使用__call__
或apply
),则任务在本地执行而不是发送到数据库;如果我异步调用它,我必须阻止Flask端并继续轮询任务队列,直到我得到结果或错误。
另一种方法是修改REST API以进行异步调用(立即返回任务ID并在客户端继续轮询结果。我个人憎恶这个想法,这对于像毫米基本CRUD这样的毫秒级任务看起来很愚蠢操作
是否有一种优雅的方法来包装task.delay
,以使其看起来像一个同步调用,并且还有一个工作人员执行的任务?
答案 0 :(得分:0)
是的,有 - 不知道我在文档中错过AsyncResult.get
:
AsyncResult.get(timeout=None, propagate=True, interval=0.5)
等到任务准备就绪,然后返回结果。
所以你只需要调用这样的任务:
task.delay(args).get(timeout=1)