我的龙卷风项目中有旧的芹菜版本。我当前的芹菜版本是3.1.23。有一个旧的https://github.com/mher/tornado-celery库现在已经死了,所以我想摆脱它,并将芹菜更新为新版本。
我不想更改大量代码,因此我希望能够在我的芹菜任务中使用异步/等待语法。可以做这样的事情
@app.task
async def add(x, y):
res = await some_async_function(x)
......
?
我只看到了带有同步代码的示例,我不确定我的情况是否适合芹菜
任何提示对异步或龙卷风都是有益的。
UPD:
即使芹菜任务已经是异步的,我也需要使用协程的能力。我需要协程,因为当前我们有很多用异步调用编写的任务,这要归功于龙卷风芹菜库和某种黑魔法。我们通过异步驱动程序进行数据库调用,对AWS进行异步调用等等。因此,我需要在celery任务中使用异步语法。我可以在asyncio中使用诸如event_loop.run_until_complete(...)或tornado.ioloop.IOLoop.instance()。run_sync(lambda:do_something(1))之类的东西,但这绝对不是可取的方式
答案 0 :(得分:1)
据我所知,目前尚不可能...
Celery任务无论如何都是异步执行的,因此实际上不需要使用协程。 delay(),apply_async()和send_task()返回AsyncResult(类似未来的对象)。这一切都是有道理的,因为Celery早于Python的asyncio和async / await,后来才出现在该语言中。
如果您绝对必须使用async / await,我想到的唯一解决方案是将异步逻辑包装在常规Celery任务中。