【发布时间】:2019-09-03 13:50:54
【问题描述】:
我希望能够在我的 celery 任务中使用异步代码。它适用于异步或龙卷风。我发现,我可以做这样的事情
from tornado.ioloop import IOLoop
from celery._state import _task_stack
from . import celery
class AsyncTask(celery.Task):
def __call__(self, *args, **kwargs):
_task_stack.push(self)
self.push_request(args=args, kwargs=kwargs)
try:
IOLoop.current().run_sync(lambda: self.run(*args, **kwargs))
finally:
self.pop_request()
_task_stack.pop()
然后像这样使用它
from .celery import celery
from tornado.httpclient import AsyncHTTPClient
@celery.task(base=AsyncTask)
async def test_async_celery_task(x, y):
result = await AsyncHTTPClient().fetch(request='https://google.com.ua')
print('Async IS OKAY: {}'.format(result))
或者我可以直接在任务中使用run_sync,这不是可取的
我想知道是否可以执行上述操作,或者我应该在 worker 中启动事件循环并通过 add_future 启动我的任务。有没有其他人做过类似的事情?我可以期待一些性能提升吗?
我需要这个,因为我需要能够使用来自项目其他部分的异步代码,例如数据库调用 ets
【问题讨论】:
标签: python async-await celery tornado python-asyncio