我在python中有一個多線程應用程序,其中我創建了多個生產者線程,並從數據庫中提取數據。數據以塊形式提取。所以線程創建帶限制值的sql語句的部分被保存在鎖內。爲了讓線程同時執行查詢,query()函數保持在鎖之外。然後結果提取部分再次保持在鎖定下。以下是代碼片段:python中的多線程應用程序中的分段錯誤錯誤
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查詢的執行?
好的,這是一些非常有用的信息。現在我有一個設計相關的問題。這個類的UserAgent應該是一個自包含的類,它的對象曾經實例化,創建一個db連接,當調用getData()時,它將把數據返回給調用者。現在,如果我必須讓線程訪問這個,我需要爲每個線程分別建立數據庫連接。那麼我怎麼能做到這一點?我應該在生產者中創建數據庫連接並將其傳遞給'getData()'。這聽起來有點奇怪,你會建議什麼? – Shades88
使用本地線程:[Python中的線程本地存儲](http://stackoverflow.com/q/1408171) –
或者,使用專用[連接池庫](http://code.google.com/p/) pysqlpool /)。 –