pytest-parallel 多线程执行用例,访问pymysql数据库,遇到的问题
遇到的问题
1、pymysql.err.ProgrammingError: execute() first
2、File "D:\xxx\python3.8\lib\site-packages\pymysql\connections.py", line 729, in _read_bytes
self._sock.settimeout(self._read_timeout)
AttributeError: 'NoneType' object has no attribute 'settimeout'


原因
封装的pymysql方法,是针对单线程访问,查询等查找,并设置共享连接和游标,多个线程创建数据库连接时,就会出现问题
import pymysql def connect(self):
self.db = pymysql.connect(**self.sql_config)
self.cursor = self.db.cursor()
封装的单线程的pymysql的游标,设置为类的实例变量,可以共享,在其它线程已经执行了关闭,所以再次关闭时,就会出现问题,提示已经关闭

解决
使用支持多线程的DButils来操作pymysql
DBUtils 是一套用于管理数据库连接池的Python包,为高频度高并发的数据库访问提供更好的性能,可以自动管理连接对象的创建和释放。并允许对非线程安全的数据库接口进行线程安全包装。
DBUtils提供两种外部接口:
PersistentDB :提供线程专用的数据库连接,并自动管理连接。
PooledDB :提供线程间可共享的数据库连接,并自动管理连接。把连接放回连接池而不是真正的关闭
DButils:不仅仅支持pymysql
参考链接:https://blog.csdn.net/weixin_42176112/article/details/109827843
使用DButils管理连接池,操作数据库,遇到的问题
PooledDB:配置连接池,提供共享数据库连接时,将连接和游标设置为类的实例变量,导致多线程执行,获取到的共享的连接和游标,导致第一次查询之后,会将设置为共享实例变量的pool_db和pool_cursor放回连接池,这时候再获取,就会报错




解决方法: 不共享连接和游标,直接返回连接和游标使用,可看下面的完整代码
错误解析可参考:https://blog.csdn.net/mtj66/article/details/125501757
python多线程读取pymysql: https://www.cnblogs.com/liwxmyself/p/15366449.html
完整代码
def mysql_connection(self):
'''
【多线程操作数据库】:创建数据库连接池,每调用一次数据,就会从连接池中取出一个进行操作,完成操作后返回给连接池
DBUtils: 允许在多线程应用和数据库之间连接的模块套件;
:return:
'''
# 连接池最大连接数
maxconnections = 8
try:
pool = PooledDB(pymysql, maxconnections, **self.sql_config) # , use_unicode = True
pool_db = pool.connection()
pool_cursor = pool_db.cursor()
return pool_db, pool_cursor
except pymysql.Error as e:
mylog.logger.exception(f"连接异常: DButils连接数据池出错,请检查: {e}")
关闭游标,关闭连接,实际将连接返回给连接池
def dbutils_colse(self, con, cursor):
try:
cursor.close()
con.close() # 将连接放回连接池
except pymysql.Error as e:
mylog.logger.error("数据库关闭失败:{0}".format(e))
同步更新查询、编辑封装的方法,使用Dbutils
def get_data(self, sql):
pool_db, pool_cursor = self.mysql_connection()
try:
pool_cursor.execute(sql)
res = pool_cursor.fetchall() # 返回的是数组的类型
return res
except Exception as e:
mylog.logger.exception("查询数据出错,请检查{0}".format(e))
finally:
self.dbutils_colse(pool_db, pool_cursor)
pytest-parallel 多线程执行用例,访问pymysql数据库,遇到的问题的更多相关文章
- pytest多进程/多线程执行测试用例
前言: 实际项目中的用例数量会非常多,几百上千:如果采用单进程串行执行的话会非常耗费时间.假设每条用例耗时2s,1000条就需要2000s $\approx$ 33min:还要加上用例加载.测试前/后 ...
- python--selenium多线程执行用例实例/执行多个用例
python--selenium多线程执行用例实例/执行多个用例 我们在做selenium测试的时候呢,经常会碰到一些需要执行多个用例的情况,也就是多线 程执行py程序,我们前面讲过单个的py用例怎么 ...
- Python-Unittest多线程执行用例
前言 假设执行一条脚本(.py)用例一分钟,那么100个脚本需要100分钟,当你的用例达到一千条时需要1000分钟,也就是16个多小时... 那么如何并行运行多个.py的脚本,节省时间呢?这就用到多线 ...
- selenium+python-unittest多线程执行用例
前言 假设执行一条脚本(.py)用例一分钟,那么100个脚本需要100分钟,当你的用例达到一千条时需要1000分钟,也就是16个多小时...那么如何并行运行多个.py的脚本,节省时间呢?这就用到多线程 ...
- selenium+python自动化90-unittest多线程执行用例
前言 假设执行一条脚本(.py)用例一分钟,那么100个脚本需要100分钟,当你的用例达到一千条时需要1000分钟,也就是16个多小时... 那么如何并行运行多个.py的脚本,节省时间呢?这就用到多线 ...
- unittest多线程执行用例
前言 假设执行一条脚本(.py)用例一分钟,那么100个脚本需要100分钟,当你的用例达到一千条时需要1000分钟,也就是16个多小时... 那么如何并行运行多个.py的脚本,节省时间呢?这就用到多线 ...
- pytest(13)-多线程、多进程执行用例
有些项目的测试用例较多,测试用例时需要分布式执行,缩短运行时间. pytest框架中提供可用于分布式执行测试用例的插件:pytest-parallel.pytest-xdist,接下来我们来学习这两个 ...
- (委托事件处理)关于多线程执行显示进度条的实例(转)&&线程间操作无效: 从不是创建控件“rtxtEntryNO”的线程访问它。
关于多线程执行显示进度条的实例! 之前回答了一篇关于怎么在线程中操作进度条的帖子,估计有人看的不是很明白今天没事,写了一个小小的实例,很简单,就2个文件权当抛砖引玉,希望有更好解决方案的人发表一下意见 ...
- unittest,selenium——批量,多线程执行多文档用例
之前做过批量执行多.py文件,为了省时也做过单py文件多线程,现在做多py文件用例多线程 # coding:utf-8import unittestimport osimport timeimport ...
- Java 线程和多线程执行过程分析
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
随机推荐
- [FAQ] uni-app 运行微信小程序 main.wxss 报错 unexpected token "$"
检查一下你是否在 App.vue 中有手动操作引入过 uni.scss,比如下面的 import: <style lang="scss"> @import url(&q ...
- 21.3K star!推荐一款可视化自动化测试/爬虫/数据采集神器!功能免费且强大!
大家好,我是狂师! 在大数据时代,信息的获取与分析变得尤为重要.对于开发者.数据分析师乃至非技术人员来说,能够高效地采集网络数据并进行分析是一个强有力的工具.今天,我要向大家推荐的是一款功能强大.操作 ...
- UOS 开启 VisualStudio 远程调试 .NET 应用之旅
本文记录的是在 Windows 系统里面,使用 VisualStudio 2022 远程调试运行在 UOS 里面 dotnet 应用的配置方法 本文写于 2024.03.19 如果你阅读本文的时间距离 ...
- 【YoloDeployCsharp】基于.NET Framework的YOLO深度学习模型部署测试平台
1. 项目介绍 基于.NET Framework 4.8 开发的深度学习模型部署测试平台,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det.Seg.Pose.Obb ...
- 通过劫持线程arena实现任意地址分配 n1ctf2018_null
通过劫持线程arena,当堆开了一个线程之后,如果没有做好保护随之的危险也悄然而至 BUU上的n1ctf2018_null很好的说明了这个问题 题目链接:BUUCTF在线评测 (buuoj.cn) 看 ...
- 【保姆级Python入门教程】马哥手把手带你安装Python、安装Pycharm、环境配置教程
您好,我是 @马哥python说 ,一枚10年程序猿. 我的社群中小白越来越多,咨询讨论的问题很多集中在python安装上,故输出此文,希望对大家起步有帮助. 下面开始,先安装Python,再安装py ...
- 轻量级.net standard微信支付登录Nuget开源库
我个人编写的库,在我个人网站,小程序等很多地方都在使用中,大家可以搜索小程序 什邡市宅猫君网络工作室 或者到我的网站 store.zhaimaojun.cn 去体验支付和登录效果. 本库主要实现了na ...
- Lora训练的参数和性能
主要为了测试模型增加Lora模块后,参数量和训练速度的变化情况.结论:正常情况下,增加Lora模块是会增加参数量的,因此前向传播和反向传播的时间也会增加.但是,在大语言模型训练的情况下,因为基础模型本 ...
- 如何在Docker容器中使用systemctl启动服务
解决方案:使用--privileged参数初始化容器 docker run -d -p 80:80 -it --privileged centos:centos8 /usr/sbin/init doc ...
- 安装XMind如何安装到指定目录
在Win10系统上安装XMind,发现安装完成之后,XMind被安装到了C盘.由于C盘是系统盘,这让人很不爽.XMind在安装过程中也没有提供安装路径选择,而是点击安装程序之后,就一路开始安装到C盘. ...