我试图将一个mysql连接传递给python中的一个线程。 如果我在worker类中初始化mysql,则没有错误。
但是,连接的成本可能很高,所以我尝试从调用函数传递mysql连接(参见下面的代码)。但这不断抛出这个错误:
(2006," MySQL服务器已经消失(BrokenPipeError(32,'破碎 管'))
知道为什么吗?我认为这是因为我们传递mysql连接的方式
def worker(db):
""" Distributes the workload for a thread
"""
while True:
item = queue_handler.get()
perform_insert(item, db)
queue_handler.task_done()
def insert_bulk(params):
""" Handles the insert
"""
cntr = 0
res = []
cannot_read = []
(data, cms, report_id) = params
db = nmi_mysql.DB(CONFIG['earnings_db'], True)
for i in range(10):
thrd = threading.Thread(target=worker, args=(db,))
thrd.deamon = True
thrd.start()
for row in data:
split_files = row.split(',')
if len(split_files) != 34:
cannot_read.append(split_files)
continue
now = datetime.datetime.now()
res.append(<some data to insert>)
if len(res) == 750 or cntr == len(data):
queue_handler.put([res, cms, report_id])
res = []
cntr += 1
queue_handler.join()
db.close()
return [len(res), cms]
更新
我们创建了一个连接池并在线程中使用该池,而不是传递mysql连接。这样,我们就可以在线程级别从池中获得连接。
答案 0 :(得分:2)
数据库连接不是线程安全的,因此您不应该将它们从一个线程传递到另一个线程。连接池保存在请求之间的开放连接上,因此从池中获取连接,将其用于查询,然后释放它会更快。
这个related answer在数据库连接的线程安全性方面有一些有用的链接。