我使用的是龙卷风web框架。是否可以让一个芹菜任务返回Future类的对象,以便在@gen.coroutine修饰的处理程序中使用它?
我想做的是:
class TornadoRequestHandler(BaseHandler):
@gen.coroutine
def get(self):
result = yield celery_task.apply_aync()
self.write(result)
self.finish()
我见过龙卷风芹菜,但这并不是我想要达到的目标。
据我所知,唯一的方法是通过龙卷风芹菜,它可以让你做到这一点:
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
,因此gen.coroutine
不能直接使用。看起来tornado-celery
的工作原理是利用apply_async
确实采用了**options
参数这一事实,该参数可以是任意的夸尔格。这意味着apply_async
实际上会接受callback
kwarg,但只是忽略它。tornado-celery
利用了这一点,重写了Celery中负责发布任务的类,并更改了发布过程以发布任务,然后在任务完成时从发布的结果队列中消耗。消费代码执行由通常被忽略的callback
kwarg提供的函数,它取出**options
。
我不确定这个解释有多清楚,但tl;dr-version是龙卷风芹菜提供了一种最简单的方式来尽可能接近你想要的行为。