mysql 多线程查询全部数据_python使用多线程查询数据库的实现示例

2023-10-31

一.背景:

当数据量过大时,一个程序的执行时间就会主要花费在等待单次查询返回结果,在这个过程中cpu无疑是处于等待io的空闲状态的,这样既浪费了cpu资源,又花费了大量时间(当然这里主要说多线程,批量查询不在考虑范围,总会存在不能批量查询的情况),在这种非密集型运算(及大量占用cpu资源)的情况下在python中无疑运用多线程是一个非常棒的选择。

二.知识点:

数据库连接池的运用及优势,python中多线程的运用,队列的运用

数据库连接池:限制了数据库的连接最大个数,每次连接都是可以重复使用的,当然也可以限制每个连接的重复使用次数(这个在这里是没必要的),需要注意的是设置的数据库的最大连接个数最好要大于我们自己开的最大线程个数,一般逻辑是每个线程占用一个数据库连接可以使程序达到最大速度,如果小于则可能存在同时连接个数大于数据库允许的最大连接个数的风险。使用数据库连接池的优势在于,python多线程并发操作数据库,会存在链接数据库超时、数据库连接丢失、数据库操作超时等问题,而数据库连接池提供线程间可共享的数据库连接,并自动管理连接。

python多线程:在程序等待io的时间里调用多线程去数据库执行查询操作。

队列:这个就是数据结构里面的知识了,一般队列的常用模式先进先出队列。(这里主要用的是队列取一个数就少一个数的原理,其实用列表也可以实现,他的先进先出主要强调的是一个顺序关系,这一点到没用上,就当是练练手了)

三.两段代码作比较:

数据库的截图:

第一段代码:正常循环查询并打印出执行时间

#!/usr/bin/python
# -*- coding=utf-8 -*-
import time
import threading
import MySQLdb
import Queue
from MySQLdb.cursors import DictCursor
from DBUtils.PooledDB import PooledDB
 
def mysql_connection():
  host = 'localhost'
  user = 'root'
  port = 3306
  password = '123456'
  db = 'test'
  charset = 'utf8'
  limit_count = 3 # 最低预启动数据库连接数量
  pool = PooledDB(MySQLdb, limit_count, maxconnections=15, host=host, user=user, port=port, passwd=password, db=db, charset=charset,
      use_unicode=True, cursorclass=DictCursor)
  return pool
 
 
start = time.time()
pool = mysql_connection()
 
for id in range(50):
  con = pool.connection()
  cur = con.cursor()
  sql = '''select id,name,age,weight from test where id = %s '''%id
  cur.execute(sql)
  time.sleep(0.5)
  result = cur.fetchall()
  if result:
    print('this is tread %s (%s,%s,%s,%s)'%(id,result[0]['id'],result[0]['name'],result[0]['age'],result[0]['weight']))
  else:
    print('this tread %s result is none'%id)
 
end = time.time() - start
print(end)

执行结果:

第二段代码:限制数据库连接池最大15个连接,用队列限制最大线程个数为10个

#!/usr/bin/python
# -*- coding=utf-8 -*-
import time
import threading
import MySQLdb
import Queue
from MySQLdb.cursors import DictCursor
from DBUtils.PooledDB import PooledDB
 
def mysql_connection():
  host = 'localhost'
  user = 'root'
  port = 3306
  password = '123456'
  db = 'test'
  charset = 'utf8'
  limit_count = 3 # 最低预启动数据库连接数量
  pool = PooledDB(MySQLdb, limit_count, maxconnections=15, host=host, user=user, port=port, passwd=password, db=db, charset=charset,
      use_unicode=True, cursorclass=DictCursor)
  return pool
 
def tread_connection_db(id):
  con = pool.connection()
  cur = con.cursor()
  sql = '''select id,name,age,weight from test where id = %s '''%id
  cur.execute(sql)
  time.sleep(0.5)
  result = cur.fetchall()
  if result:
    print('this is tread %s (%s,%s,%s,%s)'%(id,result[0]['id'],result[0]['name'],result[0]['age'],result[0]['weight']))
  else:
    print('this tread %s result is none'%id)
  con.close()
 
 
if __name__=='__main__':
  start = time.time()
  #创建线程连接池,最大限制15个连接
  pool = mysql_connection()
  #创建队列,队列的最大个数及限制线程个数
  q=Queue.Queue(maxsize=10)
  #测试数据,多线程查询数据库
  for id in range(50):
    #创建线程并放入队列中
    t = threading.Thread(target=tread_connection_db, args=(id,))
    q.put(t)
    #队列队满
    if q.qsize()==10:
      #用于记录线程,便于终止线程
      join_thread = []
      #从对列取出线程并开始线程,直到队列为空
      while q.empty()!=True:
        t = q.get()
        join_thread.append(t)
        t.start()
      #终止上一次队满时里面的所有线程
      for t in join_thread:
        t.join()
  end = time.time() - start
  print(end)

程序备注应该还算比较清晰的哈,程序执行结果:

四.结论:

看结果说话

到此这篇关于python使用多线程查询数据库的实现示例的文章就介绍到这了,更多相关python 多线程查询数据库内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql 多线程查询全部数据_python使用多线程查询数据库的实现示例 的相关文章

  • pygame库基础模块汇总

    目录 1 安装 2 使用 3 display显示模块 4 draw模块 5 event模块 event可以判断的事件 键盘事件key 6 font模块 7 time模块 8 基本框架 Pygame 是一个专门用来开发游戏的 Python 模
  • Qt+OpenGL——屏幕坐标转OpenGL归一化后的坐标

    OpenGL在显示图形时是将坐标转化为以屏幕中心为原点的一个坐标系 屏幕显示区域的x y轴的取值区间都是 1 1 如图 Qt界面的坐标系是以左上角为原点的坐标系 将鼠标点击的点转化为OpenGL坐标的算法较为简单 不再赘述直接以代码的形式进
  • 100个经典C语言程序(益智类)

    100个经典C语言程序 益智类 1 绘制余弦曲线 在屏幕上用 显示0 360度的余弦函数cos x 曲线 问题分析与算法设计 利用cos x 的左右对称性 将屏幕的行方向定义为x 列方向定义为y 则0 180度的图形与180 360度的图形
  • C语言中的指针的新认识(一)

    从开始学习C语言到现在遇到最难的问题始终是指针的问题 所以希望每次都有新的体会 然后再记录下来 能看到自己的成长 最近知道的一个新的体会 指针指向的是一个地址 所以指针所要给的值也是一个地址 所以有了这样一个值 int a 0 int p
  • 反向代理神器 Nginx Proxy Manager 快速部署(Docker-compose)

    快速部署 本文将使用 NginxProxyManager 中文版 介绍NginxProxyManager基于Docker compose的快速部分方法 GitHub xiaoxinpro nginx proxy manager zh Doc
  • Vue <router-link>标签绑定@click点击事件失败

    失败原因 router link标签本身会阻止click事件 使用常规的 click绑定点击事件自然会失败 解决方案 click之后添加native修饰符
  • 弹性伸缩:云计算中的自动资源调度

    弹性伸缩是什么 它又在云计算中是如何工作的 随着云计算技术的不断发展 弹性伸缩作为其核心特性之一 越来越受到人们的关注 那么 弹性伸缩到底是什么呢 它又是如何工作的呢 首先 让我们来了解一下弹性伸缩的定义 在云计算中 弹性伸缩是指一种可根据
  • python中XPath与bs4的简单使用

    XPath是XML路径语言 它是一种用来确定XML文档中某部分位置的语言 在python爬虫方面的学习中 xpath至关重要 它与正则相比具有明显的优势 下面将介绍在python中xpath的简单使用 安装方法不必多说 与其他第三方库的安装
  • 如何利用小程序打造私域流量池,实现粉丝经济增长

    随着电商行业的发展 私域流量运营已成为新趋势 小程序已成为私域流量运营的重要组成部分 本文将探讨如何利用小程序打造私域流量池 实现粉丝经济增长 一 私域流量池的定义 私域流量池指企业拥有的用户数据 社群和平台 通过私域流量池 企业可以更好地
  • 数据库主从复制,读写分离,分库分表理解 (数据库架构演变)

    主从复制 主从复制 主要是针对MySQL数据库的高可用性 容灾性上面 是叫做高可用性 高可用性可以简单的理解为容灾性 稳定性 针对故障 风险情况下的处理 备案 策略 指系统无中断地执行其功能的能力 代表系统的可用性程度 高可用性通常通过提高
  • Docker 实践(九):生产环境优化

    系列文章第五篇中介绍了线上生产环境使用 Docker 集群 这篇文章对原来的架构进行了优化 同时使用了 Docker 最新的一些特性 记录一些流水账 CentOS CentOS 和 Docker 确实不搭 但是苦于做不了主 只能硬着头皮上了
  • 【从零开始的Java开发】2-9-3 油画商城静态网页案例

    文章目录 项目展示 项目 0 准备工作 1 页眉区的制作 1 1 logo和menu位置的摆放 1 2 menu功能的实现 1 3 menu功能的样式 1 4 登录与注册 1 5 小结 2 正文区的制作 2 1 页眉和banner区 2 2
  • Android Dialog用法

    摘要 创建对话框 一个对话框一般是一个出现在当前Activity之上的一个小窗口 处于下面的Activity失去焦点 对话框接受所有的用户交互 对话框一般用于提示信息和与当前应用程序直接相关的小功能 Android API 支持下列类型 创
  • 什么是结构因果模型

    结构因果模型 结构因果模型简介 定义 历史 因果关系之梯 关联 干预 反事实 因果 因果和相关 类型 必要因 充分因 促成因 模型 因果图 模型元素 连接方式 链 叉 对撞 节点类型 中介变量 混杂因子 工具变量 孟德尔随机化 关联 独立性
  • linux内核编程入门之proc文件读写

    my proc dir proc create myproc 0666 NULL proc ops 在 proc 根目录下创建文件myproc 文件的权限为0666 文件的读写操作定位在proc ops中 具体可以看下面源码 可以使用 ec
  • 蜂群算法论文【matlab代码与仿真】

    一 算法流程 蜂群算法 Bee Algorithm 是一种启发式优化算法 灵感来源于蜜蜂在寻找食物和选择巢穴的行为 这种算法模拟了蜜蜂群体中的集体智能 用于解决各种优化问题 蜂群算法的基本思想是通过模拟蜜蜂的搜索行为来寻找最优解 算法中的蜜
  • 仙境传说RO:添加自定义道具

    仙境传说RO 添加自定义道具 大家好 我是艾西今天和大家聊一下仙境传说RO怎么添加自定义道具 在我们开服时加入一些道具模组等往往会让我们的服务器更有特色以及消费点 那么让我们直接进入正题开始操作 此处我们讲的过程中以红色药水举例 喜欢的可以
  • php弹窗一次,网站广告弹出层(每天弹出一次)

    网站广告弹出层 每天弹出一次 可以有两种做法 一 是标识符存入数据库 二 利用Jquery cookie 我这里做的是比较简单的用到的知识是Jquery cookie 这里要注意的一点是jquery cookie的值 火狐能够获取 IE 3
  • VMware桥接模式无法识别英特尔AX200无线网卡解决办法

    1 先到英特尔网站下载最新驱动 更新网卡驱动适用于 Intel 无线网络卡的 Windows 10 和 Windows 11 Wi Fi 驱动程序 2 到控制面板查看无线网卡属性是否有下图组件 没有的话 依次操作 安装 服务 添加 从磁盘安

随机推荐

  • Unidbg系列--Ollvm字符串解密

    Ollvm字符串解密 原理 使用unidbg框架 模拟调用So文件 并Hook内存写操作 当so解密操作写入内存时 回调获取解密字符串 并将其写入新so文件中 达到反OLLVM字符串加密的目的 解密脚本 package com xCrack
  • openmvs编译

    OpenMVG 和OpenMVS在Widows下使用Vs2019编译 black world 博客园 cnblogs com cmake src G Visual Studio 16 2019 A x64 DCMAKE TOOLCHAIN
  • pyspark-ml学习笔记:模型评估

    问题是这样的 如果我们想基于pyspark开发一个分布式机器训练平台 那么肯定需要对模型进行评估 而pyspark本身自带模型评估的api很少 想进行扩展的话有几种方案 1 使用udf自行编写代码进行扩展 2 使用现有的 像sklearn中
  • CentOS安装Docker

    Docker是一个开源的容器引擎 它有助于更快地交付应用 Docker可将应用程序和基础设施层隔离 并且能将基础设施当作程序一样进行管理 使用 Docker可更快地打包 测试以及部署应用程序 并可以缩短从编写到部署运行代码的周期 CentO
  • 相机标定实战之双目标定

    相机标定原理 文章目录 相机标定原理 前言 一 采集图像 二 基于Matlab单双目标定流程 采集棋盘图 三 基于OpenCV Python双目标定流程 检测棋盘格角点 对角点进行亚像素精细化 单目标定 双目标定 双目校正 保存标定参数 读
  • 服务器系统怎么设置第一启动项,服务器怎么设置启动项

    服务器怎么设置启动项 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 您需要在源端服务器上安装迁移Agent并且输入目的端
  • java: 非法字符: ‘\ufeff‘解决方法

    出现问题 在使用idea时候会出现java 非法字符 ufeff 这样的情况 原因 出现这样的问题来源于这个BOM 一般在编写时候会给你默认添加这样的一个BOM头 是隐藏起来的 编译时候会给出现编码混乱问题 详见了解BOM 隐藏字符 百度百
  • 三调与二调图斑叠加分析,筛选不同地类面积占比,筛选举证图斑

    主要步骤 标识数据 叠加分析 用标识 生成所有相交图斑 属性有原图斑的地类和国家的地类 以及原图斑的面积 生成的面域 增加4个字段 图斑的三调一级类 图斑的国家NYYPDL 是否相同 标识后的图斑面积 转换三调地类为二调的一级类 转换国家地
  • 《最强大脑第九季》C#手撸傅立叶残影题目

    在最新一季的最强大脑总决赛中 有一个比赛项目 傅立叶残影 感觉印象深刻 原理就是五根针首尾相连 按照自身的转速和杆长运动 根据提供的每根杆的转速和杆长来判断出尾部运动的残影轨迹 原理比较简单 就是一个连杆运行 好吧 知道原理就可以动手开始撸
  • 整数除法JS

    param number a param number b return number var divide function a b const MIN Math pow 2 31 const MAX Math pow 2 31 1 判断
  • Redis的事务学习及用Redis实现乐观锁,redis数据类型总结

    一 Redis的事务操作 1 Redis 事务可以一次执行多个命令 并且带有以下三个重要的保证 批量操作在发送 EXEC 命令前被放入队列缓存 收到 EXEC 命令后进入事务执行 事务中任意命令执行失败 其余的命令 依然被执行 但是如果队列
  • C语言基础知识--变量

    目录 一 C语言变量 1 局部变量 1 什么是局部变量 2 代码示例 3 代码讲解 2 全局变量 1 什么是全局变量 2 代码示例 3 代码讲解 3 静态变量 1 全局静态变量 2 局部静态变量 3 代码示例 4 代码讲解 4 const常
  • 用Python制作一个自动抢票脚本

    前言 大麦网 是中国综合类现场娱乐票务营销平台 业务覆盖演唱会 话剧 音乐剧 体育赛事等领域 但是因为票数有限 还有黄牛们不能丢了饭碗 所以导致了 很多人都抢不到票 那么 今天带大家用Python来制作一个自动抢票的脚本小程序 知识点 面向
  • 死锁产生的条件及其如何处理

    一 原因与条件 产生死锁的原因主要是 因为系统资源不足 进程运行推进的顺序不合适 资源分配不当等 发生死锁的四个必要条件 相互排斥 所涉及的资源必须不可共享 否则 将不会阻止进程在必要时使用资源 保留并等待或部分分配 进程在等待其他 请求的
  • Quartus II 操作入门

    使用Quartus设计FPGA 简单包括以下流程 新建工程 写代码 编译工程 找错误 分配引脚 重编译 下载配置 到硬件 为保证设计的正确性 在编译后 一般还需要做仿真验证 然后下载至硬件 有两种仿真方式 功能仿真 时序仿真 新建工程 写代
  • (数学)GCD总结

    目录 简介 算法实现 代码 应用 简介 GCD即Greatest Common Divisor 例如 12和30的公约数有 1 2 3 6 其中6就是12和30的最大公约数 两个整数的最大公约数主要有两种寻找方法 两数各分解质因子 然后取出
  • Python + Selenium 练习篇 - 获取页面所有邮箱

    代码如下 coding utf 8import re python中利用正则 需要导入re模块from selenium import webdriverdriver webdriver Chrome driver maximize win
  • [python爬虫] BeautifulSoup和Selenium对比爬取豆瓣Top250电影信息

    这篇文章主要对比BeautifulSoup和Selenium爬取豆瓣Top250电影信息 两种方法从本质上都是一样的 都是通过分析网页的DOM树结构进行元素定位 再定向爬取具体的电影信息 通过代码的对比 你可以进一步加深Python爬虫的印
  • Spring boot 注册过滤器的方式

    方式一 import jakarta servlet import jakarta servlet annotation WebFilter import java io IOException WebFilter public class
  • mysql 多线程查询全部数据_python使用多线程查询数据库的实现示例

    一 背景 当数据量过大时 一个程序的执行时间就会主要花费在等待单次查询返回结果 在这个过程中cpu无疑是处于等待io的空闲状态的 这样既浪费了cpu资源 又花费了大量时间 当然这里主要说多线程 批量查询不在考虑范围 总会存在不能批量查询的情