Python基于多线程操作数据库相关问题分析

本文实例分析了Python多线程操作数据库相关问题。分享给大家供大家参考,具体如下:

python多线程并发操作数据库,会存在链接数据库超时、数据库连接丢失、数据库操作超时等问题。

解决方法:使用数据库连接池,并且每次操作都从数据库连接池获取数据库操作句柄,操作完关闭连接返回数据库连接池。

*连接数据库需要设置charset = 'utf8', use_unicode = True,不然会报中文乱码问题

*网上说解决python多线程并发操作数据库问题,连接时使用self.conn.ping(True)(检查并保持长连接),但是我这边亲测无法解决,建议还是使用数据库连接池

python多线程代码:

import threading

class MyThread(threading.Thread):

def __init__(self, name, count, exec_object):

threading.Thread.__init__(self)

self.name = name

self.count = count

self.exec_object = exec_object

def run(self):

while self.count >= 0:

count = count - 1

self.exec_object.execFunc(count)

thread1 = MyThread('MyThread1', 3, ExecObject())

thread2 = MyThread('MyThread2', 5, ExecObject())

thread1.start()

thread2.start()

thread1.join() # join方法 执行完thread1的方法才继续主线程

thread2.join() # join方法 执行完thread2的方法才继续主线程

# 执行顺序 并发执行thread1 thread2,thread1和thread2执行完成才继续执行主线程

# ExecObject类是自定义数据库操作的业务逻辑类

#

########join方法详解########

thread1 = MyThread('MyThread1', 3, ExecObject())

thread2 = MyThread('MyThread2', 5, ExecObject())

thread1.start()

thread1.join() # join方法 执行完thread1的方法才继续主线程

thread2.start()

thread2.join() # join方法 执行完thread2的方法才继续主线程

# 执行顺序 先执行thread1,执行完thread1再执行thread2,执行完thread2才继续执行主线程

mysql数据库连接池代码:

import MySQLdb

from DBUtils.PooledDB import PooledDB

class MySQL:

host = 'localhost'

user = 'root'

port = 3306

pasword = ''

db = 'testDB'

charset = 'utf8'

pool = None

limit_count = 3 # 最低预启动数据库连接数量

def __init__(self):

self.pool = PooledDB(MySQLdb, self.limit_count, host = self.host, user = self.user, passwd = self.pasword, db = self.db,

port = self.port, charset = self.charset, use_unicode = True)

def select(self, sql):

conn = self.pool.connection()

cursor = conn.cursor()

cursor.execute(sql)

result = cursor.fetchall()

cursor.close()

conn.close()

return result

def insert(self, table, sql):

conn = self.pool.connection()

cursor = conn.cursor()

try:

cursor.execute(sql)

conn.commit()

return {'result':True, 'id':int(cursor.lastrowid)}

except Exception as err:

conn.rollback()

return {'result':False, 'err':err}

finally:

cursor.close()

conn.close()

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python进程与线程操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》、《Python+MySQL数据库程序设计入门教程》及《Python常见数据库操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python多线程原理与用法实例剖析

本文实例讲述了Python多线程原理与用法。分享给大家供大家参考,具体如下:

先来看个栗子:

下面来看一下I/O秘籍型的线程,举个栗子——爬虫,下面是爬下来的图片用4个线程去写文件

#!/usr/bin/env python

# -*- coding:utf-8 -*-

import re

import urllib

import threading

import Queue

import timeit

def getHtml(url):

html_page = urllib.urlopen(url).read()

return html_page

# 提取网页中图片的URL

def getUrl(html):

pattern = r'src="(http://img.*?)"' # 正则表达式

imgre = re.compile(pattern)

imglist = re.findall(imgre, html) # re.findall(pattern,string) 在string中寻找所有匹配成功的字符串,以列表形式返回值

return imglist

class getImg(threading.Thread):

def __init__(self, queue, thread_name=0): # 线程公用一个队列

threading.Thread.__init__(self)

self.queue = queue

self.thread_name = thread_name

self.start() # 启动线程

# 使用队列实现进程间通信

def run(self):

global count

while (True):

imgurl = self.queue.get() # 调用队列对象的get()方法从队头删除并返回一个项目

urllib.urlretrieve(imgurl, 'E:\mnt\girls\%s.jpg' % count)

count += 1

if self.queue.empty():

break

self.queue.task_done() # 当使用者线程调用 task_done() 以表示检索了该项目、并完成了所有的工作时,那么未完成的任务的总数就会减少。

imglist = []

def main():

global imglist

url = "http://huaban.com/favorite/beauty/" # 要爬的网页地址

html = getHtml(url)

imglist = getUrl(html)

def main_1():

global count

threads = []

count = 0

queue = Queue.Queue()

# 将所有任务加入队列

for img in imglist:

queue.put(img)

# 多线程爬去图片

for i in range(4):

thread = getImg(queue, i)

threads.append(thread)

# 阻塞线程,直到线程执行完成

for thread in threads:

thread.join()

if __name__ == '__main__':

main()

t = timeit.Timer(main_1)

print t.timeit(1)

4个线程的执行耗时为:0.421320716723秒

修改一下main_1换成单线程的:

def main_1():

global count

threads = []

count = 0

queue = Queue.Queue()

# 将所有任务加入队列

for img in imglist:

queue.put(img)

# 多线程爬去图片

for i in range(1):

thread = getImg(queue, i)

threads.append(thread)

# 阻塞线程,直到线程执行完成

for thread in threads:

thread.join()

单线程的执行耗时为:1.35626623274秒

再来看一个:

#!/usr/bin/env python

# -*- coding:utf-8 -*-

import threading

import timeit

def countdown(n):

while n > 0:

n -= 1

def task1():

COUNT = 100000000

thread1 = threading.Thread(target=countdown, args=(COUNT,))

thread1.start()

thread1.join()

def task2():

COUNT = 100000000

thread1 = threading.Thread(target=countdown, args=(COUNT // 2,))

thread2 = threading.Thread(target=countdown, args=(COUNT // 2,))

thread1.start()

thread2.start()

thread1.join()

thread2.join()

if __name__ == '__main__':

t1 = timeit.Timer(task1)

print "countdown in one thread ", t1.timeit(1)

t2 = timeit.Timer(task2)

print "countdown in two thread ", t2.timeit(1)

task1是单线程,task2是双线程,在我的4核的机器上的执行结果:

countdown in one thread 3.59939150155

countdown in two thread 9.87704289712

天呐,双线程比单线程计算慢了2倍多,这是为什么呢,因为countdown是CPU密集型任务(计算嘛)

I/O密集型任务:线程做I/O处理的时候会释放GIL,其他线程获得GIL,当该线程再做I/O操作时,又会释放GIL,如此往复;

CPU密集型任务:在多核多线程比单核多线程更差,原因是单核多线程,每次释放GIL,唤醒的哪个线程都能获取到GIL锁,所以能够无缝执行(单核多线程的本质就是顺序执行),但多核,CPU0释放GIL后,其他CPU上的线程都会进行竞争,但GIL可能会马上又被CPU0(CPU0上可能不止一个线程)拿到,导致其他几个CPU上被唤醒后的线程会醒着等待到切换时间后又进入待调度状态,这样会造成线程颠簸(thrashing),导致效率更低。

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python进程与线程操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》、《Python+MySQL数据库程序设计入门教程》及《Python常见数据库操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

python多线程读取数据库数据_Python基于多线程操作数据库相关知识点详解相关推荐

  1. python模拟购物车购物过程_Python基于数列实现购物车程序过程详解

    要求 1.启动程序后让用户输入余额,并打印商品列表 2.用户通过输入编号购买商品 3.用户选择商品购买后,根据余额判断成功或者失败,给出对应提示 4.可以随时退出,退出后打印账号余额以及购买的商品列表 ...

  2. python 消息队列 get是从队首还是队尾取东西_python分布式爬虫中消息队列知识点详解...

    当排队等待人数过多的时候,我们需要设置一个等待区防止秩序混乱,同时再有新来的想要排队也可以呆在这个地方.那么在python分布式爬虫中,消息队列就相当于这样的一个区域,爬虫要进入这个区域找寻自己想要的 ...

  3. python爬取js数据_python爬取js数据库

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  4. python文件读取与输出_python基本文件操作(文件输入和输出)

    文件输入输出中常用的文件对象方法: open: 返回一个新的文件对象,调用该对象的上的方法可对文件进行任何操作 readline: 读取一行数据包括结尾的换行符在内 write: 将数据写入文件中 c ...

  5. python向量机使用方法_Python中支持向量机SVM的使用方法详解

    除了在Matlab中使用PRTools工具箱中的svm算法,Python中一样可以使用支持向量机做分类.因为Python中的sklearn库也集成了SVM算法,本文的运行环境是Pycharm. 一.导 ...

  6. python的xpath用法介绍_python爬虫之xpath的基本使用详解

    本篇文章主要介绍了python爬虫之xpath的基本使用详解,现在分享给大家,也给大家做个参考.一起过来看看吧 一.简介 XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XM ...

  7. python内置序列类型_Python序列内置类型之元组类型详解

    Python序列内置类型之元组类型详解 1.元祖的概念 Python中的元组与列表类似,都是一个序列,不同的是元组的元素不能修改而已. 2.元组的创建 元组使用小括号,列表使用方括号. tup = ( ...

  8. python爬虫常见报错_Python爬虫常见HTTP响应状态码详解

    在使用Python进行网页数据抓取时,经常会遇到无数据返还或错误等异常,这个时候可以通过status_code命令来查看获得http请求返回的状态码,以便查找原因并制定相应的解决方案.import r ...

  9. python代码覆盖率怎么统计的_Python代码覆盖率统计工具coverage.py用法详解

    1.安装coverage pip install coverage 安装完成后,会在Python环境下的\Scripts下看到coverage.exe: 2.Coverage 命令行 coverage ...

最新文章

  1. java读取xml文件
  2. python可以从事什么工作-学Python可以找什么工作或者做什么兼职?
  3. 【caffe解读】 caffe从数学公式到代码实现1-导论
  4. 先查询再插入的存储过程怎么写_谈一谈 InnoDB(1) - 底层存储文件结构
  5. textbox 和textera 文本框多行后不能拉伸
  6. Android控制EditText的焦点
  7. [8] ADB 查看日志
  8. Centos系统查看版本
  9. 「动手学深度学习」在B站火到没谁,加这个免费实操平台,妥妥天花板
  10. 【FlexSim2019】自学笔记:一个实例看何为A连接?何为S连接?其意义的深入探讨
  11. Vue.js对数组对象的序号字段初始化重新生成序号
  12. 【图像去噪】基于butterworth滤波器、中值、维纳、小波算法实现图像去噪含GUI
  13. 5分钟latex 使用入门写llncs论文
  14. 乐高魔方机器人编程及图纸_LEGO 机器人魔方还原基本方法与过程
  15. Linux+C 开发基础
  16. 疫情对广州房价的影响
  17. 小程序FMP优化实录,已拿offer附真题解析
  18. 金融量化分析世界观和方法论
  19. Python3 实现 KMP 算法核心 PMT
  20. THE TWELFTH DAY

热门文章

  1. ASP.NET Core 中的 User Agent 识别及搜索引擎爬虫鉴定方法
  2. 【视频回放与课件】搭上AI快车-在线公益课堂:基于移动应用的人工智能开发...
  3. 使用 Docker 搭建 PostgreSQL 12 主从环境
  4. 云原生 - Istio可观察性之分布式跟踪(三)
  5. 如何提高QnA maker机器人训练中文语义理解的能力
  6. [PowerShell]人人都值得学一点PowerShell实现自动化(1)在VisualStudio上使用PowerShell...
  7. 徐磊(Devops):一名写了十几年代码但还没写够的程序员
  8. Rainbond v3.7.0:实现企业级PaaS的稳定性
  9. Visual Studio 2017 15.6版本预览,增加新功能
  10. .NET应用迁移到.NET Core(三)从商业角度看移植过程