pymysql多线程读写数据库报错:python pymysql.err.InterfaceError: (0, ”)
这是因为多线程共享了同一个数据库连接,但每个execute前没有加上互斥锁,解决方法如下:
方法一:每个execute前加上互斥锁
lock.acquire()
cursor.execute(command,data)
lock.release()方法二:
每个线程拥有自己的数据库连接,即在线程调用函数中加上数据库连接代码
方法三:
所有线程共用一个连接池,需要考虑线程总数和连接池连接数上限的问题
这里我使用的是方法二,因为这样效率最高不用等待其他的线程执行完,实际上只需要把db和cur的全局变量名改为函数内的变量名即可。
Code
# -*- coding: UTF-8 -*-
from querydata1 import queryData1
from querydata2 import queryData2
import threading
import pymysql
def getData():
def app(dicts):
db = pymysql.connect("127.0.0.1","root","root#admin","test")
cursor = db.cursor()
def insertData(keyy,values):
sql = "INSERT INTO test(keyy, value) VALUES ('{keyy}', '{value}');".format(keyy=keyy,value=values)
try:
cursor.execute(sql)
db.commit()
except Exception as e:
print(e)
db.rollback()
for key in dicts:
insertData(key,dicts[key])
db.close()
dicts1 = queryData1()
dicts2 = queryData2()
ta = threading.Thread(target=app,kwargs={'dicts':dicts1})
tb = threading.Thread(target=app,kwargs={'dicts':dicts2})
ta.start()
tb.start()
if __name__ == "__main__":
getData()参考资料:
PyMysql 在多线程下的问题
pymysql多线程读写数据库报错:Packet sequence number wrong
评论已关闭