我在我的龙卷风项目中有旧的芹菜版本。我当前的芹菜版本是3.1.23。有一个旧的库https://github.com/mher/tornado-celery现在已经死了,所以我想摆脱它,并将celery更新到新版本。
我不想更改大量的代码,所以我希望能够在我的芹菜任务中使用async/await语法。有没有可能做这样的事情
@app.task
async def add(x, y):
res = await some_async_function(x)
......我只看到过同步代码的例子,我不确定我的例子是否适用于芹菜
任何提示对异步者或龙卷风都有好处。
更新:
即使芹菜任务已经是异步的,我也需要能够使用协程。我需要协程,因为目前我们有很多使用异步调用编写的任务,这要归功于tornado-celery库和某种黑魔法。我们有通过异步驱动程序的数据库调用,对AWS的异步调用等等。正因为如此,我需要一种在芹菜任务中使用异步语法的可能性。我可以使用像event_loop.run_until_complete(...)这样的东西例如在asyncio或tornado.ioloop.IOLoop.instance().run_sync(lambda: do_something(1)中)在龙卷风中,但这绝对不是可取的方式
发布于 2019-08-14 21:27:42
目前据我所知这是不可能的.
Celery任务无论如何都是异步执行的,所以真的不需要使用协程。apply_async()、send_task()和delay()返回AsyncResult (类似未来的对象)。这一切都是有意义的,因为芹菜早于Python的asyncio和async/await,后者后来进入了该语言。
如果您一定要使用async/await,我能想到的唯一解决方案就是将您的异步逻辑封装在一个常规的Celery任务中。
https://stackoverflow.com/questions/57495500
复制相似问题