Python でマルチスレッド アプリを使用しており、複数のプロデューサー スレッドを作成し、DB からデータを抽出します。データはチャンクで抽出されます。したがって、スレッドが制限値を使用して 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 クエリの同時実行を実現するにはどうすればよいでしょうか?