2024-10-03 21:29:04 发布
网友
我正在使用tornado web框架。为了在一个@通用协同程序勋章处理人?在
我要做的是:
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时所需的行为依赖于它调用的所有异步方法来获取callbackkwarg,该方法在该方法完成时被调用。celery_task.apply_async不使用callbackkwarg,因此gen.coroutine不能直接使用。看起来tornado-celery的工作原理是利用了apply_async确实使用了**options参数,该参数可以是任意的kwargs。这意味着apply_async实际上将接受一个callbackkwarg,但忽略它。tornado-celery通过重写Celery中负责发布任务的类,将发布过程更改为发布任务,然后从发布的结果队列消耗到任务完成时。消费代码执行通常被忽略的callbackkwarg提供的函数,并将其拉出**options。在
gen.coroutine
callback
celery_task.apply_async
tornado-celery
apply_async
**options
我不确定这个解释有多清楚,但tl;dr版本是龙卷风芹菜提供了最简单的方法,尽可能接近你想要的行为。在
据我所知,唯一的方法是通过龙卷风芹菜,它可以让你做到:
原因是使用
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版本是龙卷风芹菜提供了最简单的方法,尽可能接近你想要的行为。在
相关问题 更多 >
编程相关推荐