我正在使用 tornado 网络框架。是否可以使 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 ,但这并不是我想要实现的目标。
最佳答案
据我所知,唯一的方法是通过 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
时想要的行为依赖于它调用的所有异步方法来获取 callback
kwarg,它在方法时被调用完成。 celery_task.apply_async
不接受 callback
kwarg,因此不能直接使用 gen.coroutine
。看起来 tornado-celery
的工作原理是利用 apply_async
确实采用 **options
参数的事实,该参数可以是任意 kwargs。这意味着 apply_async
实际上会接受一个 callback
kwarg,但只是忽略它。 tornado-celery
利用了这一点,重写了 Celery 中负责发布任务的类,改变了发布流程来发布你的任务,然后从发布到任务完成的结果队列中消费.消费代码执行通常被忽略的 callback
kwarg 提供的函数,它拉出 **options
。
我不确定这个解释有多清楚,但是 tl;dr 版本是 tornado-celery 提供了尽可能接近您想要的行为的最简单方法。
关于python - 让 celery 回归 future ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23846819/