python - 让 celery 回归 future

标签 python celery tornado

我正在使用 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/

相关文章:

python - PyQt - QComboBox 连接已确认,但未调用函数

python - 在 Flask App 中,Celery 应该在哪里实例化?

python - Tornado reverse_url()

javascript - ZeroMQ 在 Web 应用程序中的使用 : how frontend interacts with backend

python - 我如何打印除标题行之外的每个列表的第一个索引?

python - 在 Gunicorn workers 之间共享一个对象,或者在一个 worker 中持久化一个对象

python - 为什么 Celery 只识别来自单个 Django 应用程序的任务

python - 在 celery 任务上禁用缓存

python - 如何从Put路由和Delete的url获取ID

python - 删除文件时pyfilesystem的权限