gpt4 book ai didi

python - 将异步协程作为 celery 任务运行

转载 作者:行者123 更新时间:2023-11-28 18:56:28 27 4
gpt4 key购买 nike

我希望能够在我的 celery 任务中使用异步代码。它适用于 asyncio 或 tornado。我发现,我可以做这样的事情


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

最佳答案

并不是 ioloop 的正确使用使这个变得复杂,而是让 Celery 知道它可以而且应该使用异步任务。 Celery 与 Pools 一起运行,它可以在那里安排你的工作。池可以是线程化的,可以是多进程的,Celery 知道(通过配置)它有 X 个进程,Y 个线程,Z 个 worker ,其中有多少人有工作或空闲。但是 ATM,Celery 在技术上能够接收和运行协程,但开箱即用无法计算它们以跟踪其中有多少人有工作或空闲。如果你想看看它会是什么样子 - 有 a development code of future Celery's Asyncpool .

关于python - 将异步协程作为 celery 任务运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57773149/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com