在Python中的多线程应用程序分段错误(Segmentation fault error in a

2019-08-03 07:10发布

我在python一个多线程应用程序,其中I创建多个生产者线程和它们提取DB的数据。 数据被以块的形式提取。 那么,一个线程与极限值创建SQL语句中的部分保持锁内。 并让线程同时执行查询,查询()函数保持在锁之外。 那么结果取部分再次保持下锁。 下面的代码片段:

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) 。 因为如果我把所有的代码下锁,它执行罚款。 我明确地关闭游标获取数据后,它被查询时()函数再次发射重新开放。

此代码是一个名为类里面UserAgent ,它是一类名为共享资源的Producer 。 因此,数据库对象是共享的。 所以,问题区域99%必须是作为db对象是共享的同时击中查询和关闭光标然后必须用结果集被搞乱。 但后来如何解决这个问题,实现并行数据库查询执行?

Answer 1:

不要重复使用跨线程的连接。 创建为每个线程,而不是一个新的连接。

从MySQLdb的用户指南:

使用一次相同的连接MySQL协议不能处理多个线程。 某些早期版本MySQLdb的所利用的锁定来实现的2. threadsafety虽然这不是非常硬使用标准Cursor类(它使用完成mysql_store_result()它是由SSCursor(其使用复杂mysql_use_result() ;与后者你必须确保能够执行另一个查询之前的所有行已经阅读。它是通过增加交易的进一步复杂化,因为交易当光标执行查询开始,但到底什么时候COMMITROLLBACK由Connection对象执行。两螺纹,而交易过程中,除了不能够查询在执行过程中分享。这过于复杂的代码的地方,它只是不值得的地步,根本无法共享一个连接。

这样做的结果一般是: 不要线程之间共享连接 。 这真的不值得你的努力或地雷,并在年底,可能会影响性能,因为MySQL服务器运行为每个连接一个单独的线程。 你当然可以做这样的事情缓存连接池中,并在同一时间给一个线程这些连接。 如果让两个线程同时使用一个连接,MySQL客户端库可能会upchuck和死亡。 你被警告了。

重点煤矿。

使用线程本地存储或专用的连接池库代替。



文章来源: Segmentation fault error in a multi threaded app in python