需求
我收到了一个不同寻常的要求:必须使用芹菜与数据库层进行通信。
应用程序在后端使用Flask和MongoDB,在前端使用Angular。
发起人相信我可以启动一个任务,让其中一个工作人员将数据移入/移出Mongo,并得到结果。
到目前为止我的研究
据我所知,如果我同步调用一个芹菜任务(使用__call__
或apply
),该任务将在本地执行,而不是发送到数据库;如果异步调用它,我必须在Flask端进行阻塞,并继续轮询任务队列,直到得到结果或返回错误为止。
另一种方法是将REST API修改为进行异步调用(立即返回任务ID,并在客户端继续轮询结果。就我个人而言,我讨厌这种想法,对于毫秒范围内的任务,如基本的CRUD操作,这看起来很傻。
问题
有没有一种优雅的方式来包装task.delay
,使其看起来像一个同步调用,并且仍然由其中一个工作人员执行任务?
是的,文档中有-不知道我是如何错过AsyncResult.get
的:
AsyncResult.get(timeout=None, propagate=True, interval=0.5)
等待任务就绪,然后返回其结果。
所以你只需要这样调用任务:
task.delay(args).get(timeout=1)