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] docker-ce depends on containerd.io, docker-ce depends on docker-ce-cli
安装 docker 缺少依赖会提示你安装,一般是以下两个: Package containerd.io is not installed Package docker-ce-cli is not in ...
- dotnet 构建还原失败 NuGet.targets 错误可能原因
我在一次断电关机之后,发现我所有的项目都构建不通过了,提示在 NuGet.targets 文件的第 130 行错误.原因就是存在有某个被项目引用的 NuGet 包被损坏,在进行 NuGet 还原时读取 ...
- Anaconda环境下GPT2-Chinese的基本使用记录
偶然在看到了这个项目,感觉很厉害,于是就折腾了下,跑了一跑 项目地址:https://github.com/Morizeyao/GPT2-Chinese 如果Github下载太慢的可以用这个代下载:h ...
- sqli-labs-master 第十一关
本关为POST请求: 输入:admin'# 密码:随意 爆出当前数据库: 用户名:payload1:admin' and extractvalue(1,concat(0x7e,database(),0 ...
- 怎么样给Oracle数据库中的表添加列?
首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485212&idx=1 ...
- 关于armcc中static __inline修饰符的记录
相关的知识点:内联函数,static关键字 在一次stm32的库代码分析中发现static __inline 的函数定义,对此有些疑惑,static和inline两个关键字为什么要进行连用呢? 对此进 ...
- 如何使用Splashtop在家里进行有效的新人入职培训
编辑搜图 请点击输入图片描述 今天的新闻有点不简单,不得了. 简而言之,利用Splashtop可以在家里进行有效的新人入职培训.最棒的地方就在于--两个用户可以远程访问同一台计算机,并且可以看到彼此的 ...
- windows 文件夹添加备注
1,选中希望改动的文件夹,然后右键"单击",选择"属性"按钮. 2,打开"自定义"面板,选择"更改图标",将原来的默认文 ...
- Python:Python字符串中的r、u和转义字符
Python中字符串前面我们经常看到加r(R)或u/(U)的前缀,而这两个符号是什么意思呢? 1.r(R) r意为raw,表示不包含转义字符的原生字符串.常见的转义字符包括下列几种: 转义字符 描述 ...
- 23ai免费版本环境快速就绪
笔者感受就是搞一套Oracle 23ai的学习测试环境,从未如此的简单高效. 因为近期Oracle 23ai这个话题很火,很多人也在找实验环境想亲自体验测试一番. 其实搞这样的环境没有任何的门槛,甚至 ...