python使用多线程查询数据库的实现示例


Posted in Python onAugust 17, 2020

一.背景:

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

二.知识点:

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

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

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

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

三.两段代码作比较:

数据库的截图:

python使用多线程查询数据库的实现示例

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

#!/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)

执行结果:

python使用多线程查询数据库的实现示例

第二段代码:限制数据库连接池最大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使用多线程查询数据库的实现示例的文章就介绍到这了,更多相关python 多线程查询数据库内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
在Django框架中设置语言偏好的教程
Jul 27 Python
python基于phantomjs实现导入图片
May 13 Python
基于Django filter中用contains和icontains的区别(详解)
Dec 12 Python
Tornado 多进程实现分析详解
Jan 12 Python
Python开发最牛逼的IDE——pycharm
Aug 01 Python
python pandas消除空值和空格以及 Nan数据替换方法
Oct 30 Python
Pandas:Series和DataFrame删除指定轴上数据的方法
Nov 10 Python
Python random模块制作简易的四位数验证码
Feb 01 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
Apr 01 Python
Python使用Paramiko控制liunx第三方库
May 20 Python
Python爬虫requests库多种用法实例
May 28 Python
用pushplus+python监控亚马逊到货动态推送微信
Jan 29 Python
python使用建议与技巧分享(一)
Aug 17 #Python
Python2.6版本pip安装步骤解析
Aug 17 #Python
python中pathlib模块的基本用法与总结
Aug 17 #Python
Pycharm无法打开双击没反应的问题及解决方案
Aug 17 #Python
详解python datetime模块
Aug 17 #Python
python实现梯度下降算法的实例详解
Aug 17 #Python
python3.5的包存放的具体路径
Aug 16 #Python
You might like
PHP实现获取某个月份周次信息的方法
2015/08/11 PHP
读jQuery之十三 添加事件和删除事件的核心方法
2011/08/23 Javascript
js 验证密码强弱的小例子
2013/03/21 Javascript
jquery ajax方式直接提交整个表单核心代码
2013/08/15 Javascript
javascript放大镜效果的简单实现
2013/12/09 Javascript
js读取被点击次数的简单实例(从数据库中读取)
2014/03/07 Javascript
控制文字内容的显示与隐藏示例
2014/06/11 Javascript
上传图片js判断图片尺寸和格式兼容IE
2014/09/01 Javascript
PHP守护进程实例
2015/03/06 Javascript
解决angular的$http.post()提交数据时后台接收不到参数值问题的方法
2015/12/10 Javascript
jQuery 3.0 的 setter和getter 模式详解
2016/07/11 Javascript
浅析ES6的八进制与二进制整数字面量
2016/08/30 Javascript
JavaScript手风琴页面制作
2017/05/17 Javascript
JS写谷歌浏览器chrome的外挂实例
2018/01/11 Javascript
详解vue后台系统登录态管理
2019/04/02 Javascript
基于Fixed定位的框选功能的实现代码
2019/05/13 Javascript
使用Vue实现调用接口加载页面初始数据
2019/10/28 Javascript
[01:18:43]2014 DOTA2华西杯精英邀请赛5 24 iG VS DK
2014/05/25 DOTA
使用Python获取CPU、内存和硬盘等windowns系统信息的2个例子
2014/04/15 Python
python实现得到一个给定类的虚函数
2014/09/28 Python
Python实现字典按key或者value进行排序操作示例【sorted】
2019/05/03 Python
Python requests设置代理的方法步骤
2020/02/23 Python
详解如何修改python中字典的键和值
2020/09/29 Python
Python 生成短8位唯一id实战教程
2021/01/13 Python
国际性能运动服装品牌:Dare 2b
2018/07/27 全球购物
人力资源管理专业毕业生推荐信
2013/11/07 职场文书
2014年关于两会精神的心得体会
2014/03/17 职场文书
水利局群众路线专题民主生活会发言材料
2014/09/21 职场文书
金秋助学感谢信
2015/01/21 职场文书
政府会议通知范文
2015/04/15 职场文书
2015年幼儿园个人工作总结
2015/04/25 职场文书
2015年政教主任工作总结
2015/07/23 职场文书
读《皮囊》有感:理解是对他人的最大的善举
2019/11/14 职场文书
神州牡丹园的导游词
2019/11/20 职场文书
关于Mybatis中SQL节点的深入解析
2022/03/19 Java/Android
vue 实现弹窗关闭后刷新效果
2022/04/08 Vue.js