我如何使用python协程作为芹菜任务

时间:2019-08-14 13:14:51

标签: python celery tornado python-asyncio coroutine

我的龙卷风项目中有旧的芹菜版本。我当前的芹菜版本是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))之类的东西,但这绝对不是可取的方式

1 个答案:

答案 0 :(得分:1)

据我所知,目前尚不可能...

Celery任务无论如何都是异步执行的,因此实际上不需要使用协程。 delay(),apply_async()和send_task()返回AsyncResult(类似未来的对象)。这一切都是有道理的,因为Celery早于Python的asyncio和async / await,后来才出现在该语言中。

如果您绝对必须使用async / await,我想到的唯一解决方案是将异步逻辑包装在常规Celery任务中。