python多线程读取数据库数据_python多线程操作MySQL数据库pymysql
python多線程操作MySQL數據庫pymysql
項目中使用多線程操作數據庫提示錯誤:pymysql.err.InterfaceError: (0, ”),原因是pymysql的execute有獨占鎖機制,解決辦法是每個線程單獨一個數據庫連接,為線程增加一個數據庫連接池,改進之后的一個簡版實例:
import pymysql
import threading
class Db(object):
def __init__(self, host=None, username=None, pwd=None, dbname=None):
self.pool = {}
self.host = host
self.username = username
self.pwd = pwd
self.dbname = dbname
def get_instance(self, ):
name = threading.current_thread().name
if name not in self.pool:
conn = pymysql.connect(self.host, self.username, self.pwd, self.dbname)
self.pool[name] = conn
return self.pool[name]
class Test(object):
def __init__(self):
self.max_id = 10000
self.start_id = 1
self.db = Db('localhost', 'root', '123456', 'test')
self.lock = threading.Lock()
self.main()
def main(self):
threads = []
for i in range(150):
t = threading.Thread(target=self.insert_data)
t.start()
threads.append(t)
for t in threads:
t.join()
def insert_data(self):
db = self.db.get_instance()
cursor = db.cursor()
while True:
if self.start_id >= self.max_id:
break
s = self.start_id
with self.lock:
self.start_id += 50
if self.start_id > self.max_id:
self.start_id = self.max_id
e = self.start_id
for i in range(s, e):
sql = 'insert into archives(`id`) values(%s)' % (i,)
try:
cursor.execute(sql)
db.commit()
print(threading.current_thread().name, ': ', sql, ': success')
except:
db.rollback()
print(threading.current_thread().name, ': ', sql, ':failed')
raise
if __name__ == '__main__':
Test()
本實例運用了多線程的鎖機制,實例很典型,適合多線程處理同一批數據時使用
總結
以上是生活随笔為你收集整理的python多线程读取数据库数据_python多线程操作MySQL数据库pymysql的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【视频】大疆 DJI AIR 3 体验测
- 下一篇: jdk 中英对照 百度网盘_Hadoop