如何在不等待的情况下调用异步函数?

How can I call an async function without await?

我在 aiohttp 应用程序中有一个控制器操作。

async def handler_message(request):

    try:
        content = await request.json()
        perform_message(x,y,z)
    except (RuntimeError):
        print("error in perform fb message")
    finally:
        return web.Response(text="Done")

perform_message 是异步函数。现在,当我调用 action 时,我希望我的 action 尽快 return 并 perform_message 放入事件循环。

这样,perform_message就不执行了

一种方法是使用 create_task 函数:

import asyncio

async def handler_message(request):
    ...
    loop = asyncio.get_event_loop()
    loop.create_task(perform_message(x,y,z))
    ...

根据 loop documentation,从 Python 3.10 开始,asyncio.get_event_loop() 已弃用。如果您尝试从 coroutine/callback 获取循环实例,则应改用 asyncio.get_running_loop()。如果从主线程调用此方法将不起作用,在这种情况下必须实例化一个新循环:

loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.create_task(perform_message(x, y, z))
loop.run_forever()

此外,如果在整个程序运行时调用仅进行一次并且不需要实例化其他循环(不太可能),您可以使用:

asyncio.run(perform_message(x, y, z))

此函数创建一个事件循环并在协程结束后终止它,因此只能在上述情况下使用。

其他方法是使用 ensure_future 函数:

import asyncio

async def handler_message(request):
...
loop = asyncio.get_event_loop()
loop.ensure_future(perform_message(x,y,z))
...