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



我正在使用aiohttp编写一个REST API。

一些协同程序需要使用aiomysql库来调用数据库。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。

最新更新