gpt4 book ai didi

python - asyncio 错误地警告流对象被垃圾收集;显式调用 "stream.close()"

转载 作者:行者123 更新时间:2023-12-04 11:14:20 24 4
gpt4 key购买 nike

我正在使用 python3.8 的内置 asyncio 包和已安装的 aiomysql 包实现异步 MySQL 查询执行。即使我已经正确关闭了所有打开的游标和连接,我的控制台上仍然会出现如下错误消息。

An open stream object is being garbage collected; call "stream.close()" explicitly.
下面给出了代码的摘要......
#db.py

import asyncio

class AsyncMysqlSession:

def __init__(self, loop, db_settings=DEFAULTDB):
self.db_settings = db_settings
self.loop = loop

async def __aenter__(self):
self.conn = await aiomysql.connect(host=self.db_settings['HOST'],
port=self.db_settings['PORT'],
user=self.db_settings['USER'],
password=self.db_settings['PASSWORD'],
db=self.db_settings['NAME'],
loop=self.loop)
self.cursor = await self.conn.cursor(aiomysql.cursors.DictCursor)
return self

async def __aexit__(self, exception, value, traceback):
await self.cursor.close()
self.conn.close()

async def query(self, sql, *args):
await self.cursor.execute(sql, values)
await self.conn.commit()
rows = await self.cursor.fetchall()
return list(rows)


async def aiomysql_query(sql, *args):
"""
Mysql asynchronous connection wrapper
"""
loop = asyncio.get_event_loop()
async with AsyncMysqlSession(loop) as mysql:
db_result = await mysql.query(sql, *args)
return db_result
aiomysql_query 被导入到另一个文件中
#views.py

import asyncio
.....


async def main():
.....
.....

await aiomysql_query(sql1, *args1)
await aiomysql_query(sql2, *args2)

.....

asyncio.run(main())

....
我在这里做错了什么(?)还是错误地显示了错误信息?。
任何解决此问题的线索将不胜感激...
蒂亚!!

最佳答案

除了 await conn.wait_closed() 之外,您似乎还忘记关闭事件循环。 ,@VPfB 以上建议。
手动使用较低级别的方法调用(例如 asyncio.get_event_loop())时,您必须关闭事件循环。 .具体来说,self.loop.close()必须被调用。

#db.py

import asyncio

class AsyncMysqlSession:

def __init__(self, loop, db_settings=DEFAULTDB):
self.db_settings = db_settings
self.loop = loop

async def __aenter__(self):
self.conn = await aiomysql.connect(host=self.db_settings['HOST'],
port=self.db_settings['PORT'],
user=self.db_settings['USER'],
password=self.db_settings['PASSWORD'],
db=self.db_settings['NAME'],
loop=self.loop)
self.cursor = await self.conn.cursor(aiomysql.cursors.DictCursor)
return self

async def __aexit__(self, exception, value, traceback):
await self.cursor.close()
self.conn.close()
self.loop.close()

async def query(self, sql, *args):
await self.cursor.execute(sql, values)
await self.conn.commit()
rows = await self.cursor.fetchall()
return list(rows)


async def aiomysql_query(sql, *args):
"""
Mysql asynchronous connection wrapper
"""
loop = asyncio.get_event_loop()
async with AsyncMysqlSession(loop) as mysql:
db_result = await mysql.query(sql, *args)
return db_result
引用
https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.loop.shutdown_asyncgens
https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.get_event_loop

关于python - asyncio 错误地警告流对象被垃圾收集;显式调用 "stream.close()",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63752613/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com