Ошибка ошибки сегментации в многопоточном приложении в Python
У меня есть многопоточное приложение на 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 совместно используется, одновременно выполняется запрос запроса и закрывающий курсор должен портить набор результатов. Но тогда как решить эту проблему и добиться одновременного выполнения запроса к БД?