让芹菜回归未来

时间:2014-05-24 15:37:42

标签: python celery tornado

我正在使用龙卷风网络框架。是否有可能让一个芹菜任务返回Future类的对象,以便在@ gen.coroutine装饰处理程序中使用它?

我要做的是以下内容:

    class TornadoRequestHandler(BaseHandler):

         @gen.coroutine
         def get(self):
              result = yield celery_task.apply_aync()
              self.write(result)
              self.finish()

我已经看过tornado-celery,但这并不是我想要实现的目标。

1 个答案:

答案 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版本是龙卷风 - 芹菜提供了最简单的方法来尽可能接近你想要的行为。