我是否需要跟踪 asyncio 事件循环,或者我可以在需要时调用 asyncio.get_event_loop 吗?

Do I need to keep track of the asyncio event loop, or can I just call asyncio.get_event_loop when it is needed?

我正在使用 aiohttp.

编写 REST API

部分协程需要使用aiomysql library调用数据库。 aiomysql 的文档有以下示例:

import asyncio
import aiomysql

loop = asyncio.get_event_loop()


async def test_example():
    conn = await aiomysql.connect(host='127.0.0.1', port=3306,
                                       user='root', password='', db='mysql',
                                       loop=loop)

    cur = await conn.cursor()
    await cur.execute("SELECT Host,User FROM user")
    print(cur.description)
    r = await cur.fetchall()
    print(r)
    await cur.close()
    conn.close()

loop.run_until_complete(test_example())

我的问题是关于全局变量的定义loop:

loop = asyncio.get_event_loop()

我真的需要将 loop 作为全局变量保存在某处,还是我可以在需要时调用 asyncio.get_event_loop()

例如上面的代码示例,当我连接到数据库时,我可以得到事件循环:

    conn = await aiomysql.connect(host='127.0.0.1', port=3306,
                                       user='root', password='', db='mysql',
                                       loop=asyncio.get_event_loop())

调用 asyncio.get_event_loop() 或其他我遗漏的东西是否有不小的运行时成本?

loop 参数应该去。

aiomysql 应更新为不接受循环。

您现在可以跳过代码中的 loop=...,因为 aiomysql.connect() 具有参数的默认 loop=None 值。

一般来说,asyncio.get_event_loop()会被弃用; asyncio.get_running_loop() 建议在需要时从异步代码中使用。从 Python 3.8.

开始,不推荐将显式循环传递给 asyncio API