python使用多线程查询数据库的实现示例
作者:下划线隐患者 发布时间:2024-01-21 18:34:59
一.背景:
当数据量过大时,一个程序的执行时间就会主要花费在等待单次查询返回结果,在这个过程中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)
程序备注应该还算比较清晰的哈,程序执行结果:
四.结论:
看结果说话
来源:https://blog.csdn.net/zer_o_o/article/details/86742430


猜你喜欢
- 平常在使用python命令过程中,基本上都是用来安装python库时才使用到在控制台的python命令。然而,python命令还有更多的妙用
- 目录1、条件语句1.1 if语句2、嵌套的分支语句3、案例练习4、循环语句4.1 for-in循环4.2 range()函数4.3 实例1:
- 对于多层感知机而言,整个模型做的事情就是接收输入生成输出。但是并不是所有的多层神经网络都一样,所以为了实现复杂的神经网络就需要神经网络块,块
- scrapy是目前python使用的最广泛的爬虫框架架构图如下解释:Scrapy Engine(引擎): 负责Spider、ItemPipe
- 本文实例讲述了Python实现获取本地及远程图片大小的方法。分享给大家供大家参考,具体如下:了解过Pillow的都知道,Pillow是一个非
- 写一个循环删除的过程。 create or replace procedure delBigTab(p_TableName in varch
- 列表1~n输出步长为3的分组print([[x for x in range(1,101)][i:i+3] for i in range(0
- 方法一通过斜率关系计算,公式如下图:需注意在求斜率时不要出现竖直情况,python计算会报错,但按理说应该可以计算出无穷的,此处先放这吧,等
- MySQL 触发器MySQL 数据库中触发器是一个特殊的存储过程,不同的是执行存储过程要使用 CALL 语句来调用,而触发器的执行不需要使用
- 非常抱歉,今天早上 6:37~8:15 期间,由于获取网站首页博文列表的 SQL 语句出现突发的查询超时问题,造成访问网站首页时出现 500
- MooTools 1.2介绍原文地址:30 Days of Mootools 1.2 Tutorials - Day 1 - Intro t
- 背景介绍#ubuntu 20.04 版本系统自带的 MySQL 版本是 8.0,普通方法很难安装 5.7 版本的。由于 8.0 版本较 5.
- Python求取逆序数方法一.pynum = int(input('请输入一个三位整数:'))a = num//100b =
- 本文实例为大家分享了JavaScript实现烟花特效的具体代码,供大家参考,具体内容如下本特效使用面向对象编程分析OOA点击触发事件烟花运动
- 使用指令:pyinstaller -F -w main.py生成的.exe文件执行报错看报错信息,初步怀疑是生成的.exe不能执行.ini配
- 对于一些快速迭代的产品来说,特别是移动端 C端产品,基于用户运营的目的,在 app首页给用户展示各种各样的弹窗是很常见的事情,在产品初期,由
- 最小生成树的Prim算法也是贪心算法的一大经典应用。Prim算法的特点是时刻维护一棵树,算法不断加边,加的过程始终是一棵树。Prim算法过程
- 本文实例为大家分享了Python OpenCV调用摄像头检测人脸并截图的具体代码,供大家参考,具体内容如 * 意:需要在python中安装Op
- 这两天做了一个判断浏览器类型和版本号的业务,记录下相关的js代码: function allinfo(){ var ua = navigat
- 想画一个比较复杂的图像,而且还想用turtle画,最让人想退却的是无规律的笔势和繁多的坐标,但既然没有按奈住冲动的心,那我告诉你一个比较笨的