gpt4 book ai didi

python - 将 mysql 连接传递给 python 线程时管道损坏

转载 作者:可可西里 更新时间:2023-11-01 06:49:49 29 4
gpt4 key购买 nike

我正在尝试将 mysql 连接传递给 python 中的线程。如果我在工作类中对 mysql 进行初始化,则没有错误。

但是,连接的成本可能很高,所以我尝试只从调用函数传递 mysql 连接(参见下面的代码)。但这不断抛出这个错误:

(2006, "MySQL server has gone away (BrokenPipeError(32, 'Broken pipe'))

知道为什么吗?我认为这是因为我们传递 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 连接,而是创建了一个连接池并在线程中使用该池。这样,我们就可以在线程级别从池中获取连接。

最佳答案

数据库连接不是线程安全的,因此您不应将它们从一个线程传递到另一个线程。连接池保留请求之间的打开连接,因此从池中获取连接、将其用于查询然后释放它会更快。

related answer有一些关于数据库连接线程安全的有用链接。

关于python - 将 mysql 连接传递给 python 线程时管道损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33228743/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com