品牌电视,龙图腾简谱,一家之鼠1国语
昨天在参照着网上写一段关于mysql连接池的配合gevent多线程调用的代码时遇到了一个问题,自己写的代码根本不能多线程执行,比单会话插入数据慢太多,直到今天早上才发现问题所在,把db api从mysqldb换为pymysql之后得到解决,因此测试了一下不同db api和os下executemany()的表现,先贴一下剪短的测试代码:
# -*- coding: utf-8 -*-
import mysqldb
import pymysql
import time
conn=pymysql.connect(host='192.168.1.174',port=3306,user='leo',passwd='leo',db='leo',charset='utf8')
conn.autocommit(true)
start_time=time.time()
with conn as cursor:
data=((i,"messi%s"%i) for i in range(10000))
cursor.executemany("insert into test values(%s,%s);",data)
cursor.execute("select count(*) from test;")
print(cursor.fetchall())
print("elapsed time: ",(time.time()-start_time))
以上一段代码在python2、3通用,通过开启general log来观察sql和事务状态。
使用不同版本的解释器执行测试的结果如下:
其他db api诸如sqlalchemy等未进行测试。
其实之前忘了在哪里也看到过在python3中mysqlclient、mysqldb之间的关系,但是如此混乱的版本表现确实很恶心。
此外,在python2中如果将executemany()封装入连接池类中,表现又有所不同,多条sql会在同一个会话中分为多个事务依次执行。
总结起来暂时就一句话:尽量使用python3的mysqldb module。
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Python爬虫:Request Payload和Form Data的简单区别说明
浅谈Python中threading join和setDaemon用法及区别说明
Python3-异步进程回调函数(callback())介绍
python继承threading.Thread实现有返回值的子类实例
Python中使用threading.Event协调线程的运行详解
网友评论