我在 python 中有一个多线程应用程序,其中我创建了多个生产者线程,它们从数据库中提取数据。数据以块的形式提取。因此,线程创建具有限制值的 sql 语句的部分保持在锁定中。为了让线程同时执行查询,query() 函数保持在锁之外。然后结果获取部分再次被锁定。下面是代码片段:
with UserAgent.lock:
sqlGeoTarget = "call sp_ax_ari_select_user_agent_list('0'," + str(self.chunkStart) + "," + str(self.chunkSize) + ",1);"
self.chunkStart += self.chunkSize
self.dbObj.query(sqlGeoTarget)
print "query executed. Processing data now..."+sqlGeoTarget
with UserAgent.lock:
result = self.dbObj.fetchAll()
self.dbObj.dbCursor.close()
但是这段代码会产生致命错误segmentation fault (core dumped)
。因为如果我把所有代码都加锁,它执行得很好。我在获取数据后显式关闭游标,当再次触发 query() 函数时重新打开游标。
这段代码在一个名为的类中UserAgent
,它是一个名为 的类的共享资源Producer
。因此,数据库对象是共享的。所以问题区域 99% 一定是因为 db 对象是共享的同时命中查询和关闭游标然后必须弄乱结果集。但是那么如何解决这个问题并实现并发的db查询执行呢?