我正在使用龙卷风网络框架。是否有可能让一个芹菜任务返回Future类的对象,以便在@ gen.coroutine装饰处理程序中使用它?
我要做的是以下内容:
class TornadoRequestHandler(BaseHandler):
@gen.coroutine
def get(self):
result = yield celery_task.apply_aync()
self.write(result)
self.finish()
我已经看过tornado-celery,但这并不是我想要实现的目标。
答案 0 :(得分:3)
据我所知,唯一的方法是通过龙卷风芹菜,这将让你这样做:
class TornadoRequestHandler(BaseHandler):
@gen.coroutine
def get(self):
result = yield gen.Task(celery_task.apply_aync)
self.write(result)
self.finish()
原因是使用gen.coroutine
时所需的行为依赖于它调用的所有异步方法来获取callback
kwarg,该方法在方法完成时被调用。 celery_task.apply_async
没有callback
kwarg,因此gen.coroutine
无法直接使用。通过利用tornado-celery
确实采用apply_async
参数(可以是任意kwargs)这一事实,**options
看起来很有效。这意味着apply_async
实际上会接受callback
kwarg,但忽略它。 tornado-celery
通过覆盖负责发布任务的Celery中的类来利用这一点,并更改发布过程以发布任务,然后从发布的结果队列中消耗任务完成。消费代码执行正常忽略的callback
kwarg提供的函数,它将**options
拉出来。
我不确定这个解释有多清楚,但是tl; dr版本是龙卷风 - 芹菜提供了最简单的方法来尽可能接近你想要的行为。