Błąd błędu segmentacji w aplikacji wielowątkowej w Pythonie
Mam wielowątkową aplikację w Pythonie, w której tworzę wiele wątków producenta i wyodrębniają dane z DB. Dane są wyodrębniane w porcjach. Tak więc część, w której wątek tworzy instrukcję sql z wartościami granicznymi, jest przechowywana w zamku. Aby umożliwić wątkom jednoczesne wykonywanie zapytań, funkcja query () jest przechowywana poza blokadą. Następnie część pobierająca wynik jest ponownie przechowywana pod zamkiem. Poniżej znajduje się fragment kodu:
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()
Ale ten kod generuje błąd krytycznysegmentation fault (core dumped)
. Bo jeśli umieściłem cały kod pod kluczem, to działa dobrze. Po pobraniu danych jawnie zamykam kursor, jest on ponownie otwierany po ponownym uruchomieniu funkcji query ().
Ten kod znajduje się w klasie o nazwieUserAgent
i jest to wspólny zasób dla klasy o nazwieProducer
. W ten sposób obiekt bazy danych jest udostępniany. Tak więc obszar problemowy 99% musi polegać na tym, że gdy obiekt db jest współdzielony, jednoczesne klikanie zapytania i zamykanie kursora musi być kłopotliwe z zestawem wyników. Ale w jaki sposób rozwiązać ten problem i osiągnąć jednoczesne wykonanie zapytania db?