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

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秒

155955154G12F-1L28.jpg

再来看一个:

#!/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密集型任务(计算嘛)

155955154G160-2cP.jpg

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的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292631.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何通过 C# 实现对象的变更跟踪 ?

咨询区 user137348我有一个类包含五个属性,如果任何一个属性被改变,我希望这个类中的另一个属性(IsDirty)会被自动变更,比如下面的类。public class Class1 {bool IsDIrty {get;set;}string Prop1 {get;set;}string Pr…

IDA64 Fatal error before kernel init

http://www.tuicool.com/articles/7FZVZna 第一次看到这个错误还以为是修改文件导致的,但是觉得又不大像,因为在Win7底下是完全正常的。搜索了一下才发现是由于插件导致的: NOTE3: You get a “Fatal error before kernel init” when trying…

Linux 释放缓存的方法

echo "3" > /proc/sys/vm/drop_caches数字的作用0 – 不释放1 – 释放页缓存2 – 释放dentries和inodes3 – 释放所有缓存可以加到定时任务里,凌晨5点执行回收。0 5 * * * sync && echo "3" > /proc/sys/vm/drop_caches转载于:ht…

Android安全与逆向之在ubuntu上面搭建NDK环境

1、下载Android NDK自解压包, 官方地址:https://developer.android.com/ndk/downloads/index.html#download下载:$ wget -c http://dl.google.com/android/ndk/android-ndk-r10e-linux-x86_64.bin 2、解压, 将Android NDK压缩包…

C# 泛型多种参数类型与多重约束 示例

C# 泛型多种参数类型与多重约束 示例 interface IMyInterface { }class Dictionary<TKey, TVal>where TKey : IComparable, IEnumerablewhere TVal : IMyInterface {public void Add(TKey key, TVal val){} }转载于:https://www.cnblogs.com/EasyInvoice/p/5955216.html

简述python解释器的作用_什么是python解释器?

当我们编写Python代码时&#xff0c;我们得到的是一个包含Python代码的以.py为扩展名的文本文件。要运行代码&#xff0c;就需要Python解释器去执行.py文件。 由于整个Python语言从规范到解释器都是开源的&#xff0c;所以理论上&#xff0c;只要水平够高&#xff0c;任何人都可…

和我一起来分析某药品仓储管理系统 卡死现象

一&#xff1a;背景 1. 讲故事这个月初&#xff0c;有位朋友wx上找到我&#xff0c;说他的api过一段时间后&#xff0c;就会出现只有请求&#xff0c;没有响应的情况&#xff0c;截图如下&#xff1a;从朋友的描述中看样子程序是被什么东西卡住了&#xff0c;这种卡死的问题解决…

Java代码总结【1】_查询手机号码归属地

这段代码是查询指定手机号的代码归属地&#xff0c;输出格式为【省份运营商】public static String checkMobilePlace(String mobilephone)throws IOException {//检测手机号码归属地URL url new URL("http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel" …

linux top 命令---VIRT,RES,SHR,虚拟内存和物理内存(

VIRT,RES,SHR,虚拟内存和物理内存(转) VIRT&#xff1a; 1、进程“需要的”虚拟内存大小&#xff0c;包括进程使用的库、代码、数据&#xff0c;以及malloc、new分配的堆空间和分配的栈空间等&#xff1b; 2、假如进程新申请10MB的内存&#xff0c;但实际只使用了1MB&#xff0…

第五十三篇、OC利用AFN上传视频到服务器

整体思路已经清楚&#xff0c;拿到视频资源&#xff0c;先转为mp4&#xff0c;写进沙盒&#xff0c;然后上传&#xff0c;上传成功后删除沙盒中的文件。 本地拍摄的视频&#xff0c;上传到服务器&#xff1a; //视频转换为MP4//转码操作..._hud.mode MBProgressHUDModeIndeter…

sqlite数据库备份还原、导出导入

1、备份和还原数据库 sqlite> .backup backup.db sqlite> .restore backup.db 2、导出及导入SQL脚本 shell方式&#xff1a; # sqlite3 sqa.db ".dump [mytabl%]" > sqa.sql # sqlite3 sqb.db < sqa.sql 命令行方式&#xff1a; sqlite> .output b…

python程序题斐波那契数列_Python_经典题_斐波那契数列

古典问题&#xff1a;3个月起每个月都生一对兔子&#xff0c;小兔子长到第三个月后每个月又生一对兔子&#xff0c;假如兔子都不死&#xff0c;问每个月兔子总数是多少&#xff1f;&#xff08;使用循环实现&#xff09; 分析&#xff1a; 第一个月是1对 第二个月还是1对 第三个…

SQLite数据库损坏与修复

&#xfeff;&#xfeff;导致SQLite数据库损坏的情况 导致SQLite数据库损坏的情况大致可归结为4类&#xff1a;文件覆盖问题、文件锁问题、数据同步问题、内存问题文件覆盖问题 SQLite数据库文件被覆盖是可能的&#xff0c;毕竟是一个普通的磁盘文件&#xff0c;意味着所有的…

如何定位Source Generators性能问题

前言在以前的文章中&#xff0c;我们介绍过如何调试Source Generators。但是当实现较为复杂时&#xff0c;我们需要能够快速地分析Source Generators性能的方法。默认情况下&#xff0c;使用VS 2019自带的“性能探查器”不能分析Source Generators项目&#xff0c;因为它是类库…

什么是域(domain)

在今天很多人都有意识或无意识的跟域这个东西打过交道。如果你在公司里使用电脑&#xff0c;并且你的电脑接入了公司的局域网&#xff0c;那你的电脑很可能就在一个域中。如何查看你的电脑是否连接到一个域中&#xff0c;以Windows为例&#xff0c;右击我的电脑 –>属性&…

四舍五入运算

为什么80%的码农都做不了架构师&#xff1f;>>> 请用户输入1个实数(浮点型),请编写算法对这个实数进行四舍五入到个位的运算. 例如 12.56经过四舍五入运算得到13. 而12.45经过四舍五入运算得到12 代码如下地址: http://git.oschina.net/touch1D/qf17j3eughwdp8zxi…

python 新建html_Python学习第226课——html中创建按钮

前面我们学习了一些常见的表单元素&#xff0c;表单就是用来收集用户的信息的&#xff0c;比如调查问卷、用户登录网站的页面等这类的网页&#xff0c;里面都要用到表单元素&#xff0c;当用户在前端页面上填入账号、密码、或者调查问卷的答案等等信息之后&#xff0c;就需要提…

Linux之软连接和硬链接

&#xfeff;&#xfeff;1.Linux链接概念 Linux链接分两种&#xff0c;一种被称为硬链接&#xff08;Hard Link&#xff09;&#xff0c;另一种被称为符号链接&#xff08;Symbolic Link&#xff09;。默认情况下&#xff0c;ln命令产生硬链接。 【硬连接】 硬连接指通过索引…