我正在使用龙卷风Web框架.是否可以使celery任务返回Future类的对象,以便在@ gen.coroutine装饰的处理程序中使用它?
我正在尝试做以下事情:
class TornadoRequestHandler(BaseHandler):
@gen.coroutine
def get(self):
result = yield celery_task.apply_aync()
self.write(result)
self.finish()
我已经看过tornado-celery,但这并不是我想要达到的目标.
解决方法:
据我所知,唯一的方法是通过龙卷风芹菜,这将使您做到这一点:
class TornadoRequestHandler(BaseHandler):
@gen.coroutine
def get(self):
result = yield gen.Task(celery_task.apply_aync)
self.write(result)
self.finish()
原因是使用gen.coroutine时想要的行为依赖于它调用的所有异步方法来获取回调kwarg,该回调在方法完成时被调用. celery_task.apply_async不接受回调kwarg,因此gen.coroutine不能直接使用.似乎龙卷风芹菜通过利用apply_async确实接受** options参数这一事实而起作用,该参数可以是任意任意kwarg.这意味着apply_async实际上将接受回调kwarg,但只需忽略它即可.龙卷风celery通过在Celery中重写负责发布任务的类,并更改发布过程以发布您的任务,然后从要发布的结果队列中使用到任务完成为止,来利用这一点.使用代码执行通常被忽略的回调kwarg提供的功能,并提取**选项.
我不确定这个解释是否清楚,但是tl; dr版本是龙卷风芹菜提供了最简单的方法来尽可能接近您想要的行为.