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 ...
随机推荐
- WPF 获取本机所有字体拿到每个字符的宽度和高度
本文主要采用 GlyphTypeface 类尝试获取每个字符的宽度和高度的值,尽管这个方法和最终 WPF 布局使用的文本的宽度和高度是不相同的,但是依然可以作为参考 获取系统字体文件夹的文件 系统字体 ...
- NoSQL 数据库管理工具,搭载强大支持:Redis、Memcached、SSDB、LevelDB、RocksDB,为您的数据存储提供无与伦比的灵活性与性能!
NoSQL 数据库管理工具,搭载强大支持:Redis.Memcached.SSDB.LevelDB.RocksDB,为您的数据存储提供无与伦比的灵活性与性能! [官网地址]:http://www.re ...
- 006_Orcad创建Hetergeneous分裂元件
006_Orcad创建Hetergeneous分裂元件 以169脚的EMMC为例: 分为两部分,用到的引脚和NC的引脚. 先画一个框,依据引脚功能添加引脚.A部分做好,做B部分.引脚多,可以用pin ...
- 03. go-zero简介及如何学go-zero
目录 一.go-zero简介及如何学go-zero 1.go-zero官方文档 2.go-zero微服务框架入门教程 3.go-zero最佳实践 4.学习资料 二.go-zero环境搭建 1.GO环境 ...
- LVS负载均衡(7)-- LVS+keepalived实现高可用
目录 1. LVS+keepalived实现高可用 1.1 实验环境说明 1.2 路由器配置 1.3 WEB服务器nginx配置 1.4 LVS+keepalived配置 1.4.1 keepaliv ...
- cesium常见问题和解决
- C 语言编程 — 高级数据类型 — 枚举
目录 文章目录 目录 前文列表 声明枚举类型 定义枚举类型的变量 枚举类型变量的枚举值 枚举在 switch 语句中的使用 将整型转换为枚举类型 前文列表 <程序编译流程与 GCC 编译器> ...
- 推荐一款模拟浏览器自动化操作神器!Mechanize
大家好,我是狂师! 今天给大家推荐一款用于模拟浏览器行为以进行网页自动化操作Python库:Mechanize. 1.介绍 Mechanize是Python中的一个库,它被设计用来自动化网页浏览和数据 ...
- mySql脚本转换成sqlserver脚本(主流数据库的脚本都能转换,需要使用powerdesigner)
我使用的powerdesginer版本是16.5,只需要脚本文件就可以了,不需要安装mysql和sqlserver. 文件->反向工程->Database... 选择原脚本文件的数据库类型 ...
- ASP.NET Core SignalR .NET 客户端
项目 2022/11/29 13 个参与者 反馈 通过 ASP.NET Core SignalR .NET 客户端库可以从 .NET 应用与 SignalR 中心进行通信. 查看或下载示例代码(如何下 ...