【发布时间】:2021-08-05 14:49:34
【问题描述】:
背景:我用tornado + motor,发现mem_usage增加了。
然后我编写 test.py 代码。 db.tasks “大小”:12192854 (10+M)。一分钟后,MEM USAGE / LIMIT 为 1.219GiB / 8GiB
环境:
- python 3.7.5
- 电机 2.5.0(升级前为 2.1.0)
- multidict 4.7.5
- pymongo 3.12.0
这是我的代码
import os
import gc
import time
import logging
import asyncio
import uvloop
import pdb
import pymongo
import base64
from tornado.platform.asyncio import AsyncIOMainLoop
from guppy import hpy
from motor import motor_asyncio
mongo_auth = 'xxxxx='
runtime_mongos = arch_mongos = {
"host": f"mongodb://{base64.b64decode(mongo_auth).decode()}@" + ','.join(
[
"1xxx:27024",
"2xxx:27024",
"3xxx:27024",
]),
"readPreference": "secondaryPreferred"
}
table = motor_asyncio.AsyncIOMotorClient(**runtime_mongos)["db"]["tasks"]
async def get_data():
return await table.find().sort([
("priority", pymongo.ASCENDING),
("start_uts", pymongo.ASCENDING),
]).to_list(None)
async def test():
while True:
a = await get_data()
print(len(a))
await asyncio.sleep(1)
gc.collect() # no use!
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(test())
【问题讨论】:
-
a仍然持有对数据的引用。当您运行垃圾收集器时,a仍在作用域内,因此不会被清理。如果您在调用gc.collect()之前添加del a,它是否可以正常工作。 -
@dirn 'a' 会持有一些mem,但实际上,我编码“await get_data()”,mem 仍然增加。最后,我尝试“del a”,问题依旧存在
标签: python-3.x pymongo python-asyncio tornado