Pymongo操作间歇性无响应问题求助
解决PyMongo间歇性挂起无响应问题
1. 版本兼容性问题
PyMongo 3.10.0发布于2020年,而Python 3.10是2021年推出的,旧版本PyMongo对Python 3.10的支持不完善,存在未修复的阻塞类bug。PyMongo从3.12版本开始正式支持Python 3.10,建议升级至兼容版本:
pip install --upgrade pymongo>=3.12
2. 缺失超时配置导致无限等待
默认MongoClient未设置超时参数,当MongoDB服务或网络出现短暂异常时,客户端会无限期等待响应,直接导致程序挂起。修改代码添加超时限制:
from pymongo import MongoClient # 配置各类超时参数(单位:毫秒) client = MongoClient( 'mongodb://localhost:27017', connectTimeoutMS=5000, # 连接服务器超时时间 socketTimeoutMS=5000, # 读写操作超时时间 serverSelectionTimeoutMS=5000 # 服务器选择超时时间 ) db_obj = client["my_database_name"] query = {"name":"ABC"} print("Going to perform mongo operations") try: ping = client.admin.command('ping') if ping['ok'] == 1: print("mongo is up and running") data = list(db_obj["collection_name"].find(query)) print(data) else: print("mongo is not up and running") except Exception as e: print(f"Mongo operation failed: {str(e)}")
3. MongoDB服务器连接池或资源瓶颈
MongoDB 4.2的连接池配置可能存在瓶颈,或者服务器端积压了大量未释放的连接,导致新请求被阻塞:
- 查看MongoDB日志(默认路径
/var/log/mongodb/mongod.log),排查是否有连接超时、资源耗尽的报错信息。 - 在MongoClient中限制连接池大小,避免创建过多连接:
client = MongoClient( 'mongodb://localhost:27017', maxPoolSize=10, # 根据业务场景调整,默认是100 # 加上之前的超时参数 connectTimeoutMS=5000, socketTimeoutMS=5000, serverSelectionTimeoutMS=5000 )
4. 操作系统网络栈异常
操作系统TCP连接处于TIME_WAIT/CLOSE_WAIT状态过多,会占用端口资源,导致新连接无法建立:
- 执行
netstat -an | grep 27017查看端口连接状态,清理异常连接。 - 针对Linux系统,可调整TCP参数缩短TIME_WAIT超时:编辑
/etc/sysctl.conf添加以下配置,执行sysctl -p生效:net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_fin_timeout = 30
内容的提问来源于stack exchange,提问作者Aswathi Raj K T
相关产品推荐
相关产品推荐

