芹菜还福图

2024-10-03 21:29:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用tornado web框架。为了在一个@通用协同程序勋章处理人?在

我要做的是:

    class TornadoRequestHandler(BaseHandler):

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

我见过tornado-celery,但这并不是我想要达到的目标。在


Tags: self框架webgetdefresulttornadoclass
1条回答
网友
1楼 · 发布于 2024-10-03 21:29:04

据我所知,唯一的方法是通过龙卷风芹菜,它可以让你做到:

class TornadoRequestHandler(BaseHandler):

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

原因是使用gen.coroutine时所需的行为依赖于它调用的所有异步方法来获取callbackkwarg,该方法在该方法完成时被调用。celery_task.apply_async不使用callbackkwarg,因此gen.coroutine不能直接使用。看起来tornado-celery的工作原理是利用了apply_async确实使用了**options参数,该参数可以是任意的kwargs。这意味着apply_async实际上将接受一个callbackkwarg,但忽略它。tornado-celery通过重写Celery中负责发布任务的类,将发布过程更改为发布任务,然后从发布的结果队列消耗到任务完成时。消费代码执行通常被忽略的callbackkwarg提供的函数,并将其拉出**options。在

我不确定这个解释有多清楚,但tl;dr版本是龙卷风芹菜提供了最简单的方法,尽可能接近你想要的行为。在

相关问题 更多 >