Я создал функцию для выполнения запроса к БД в Postgresql, а внутри функции я создал 5 потоков для выполнения незначительных операций с БД. Во время создания потока вместо отправки объекта соединения Postgres каждому потоку я отправил объект-курсор для непосредственного запроса. Хотя на моем локальном компьютере (ma c -OS) он успешно работал без проблем, существует проблема, и запросы на компьютере windows не выполняются.
def MainFunction(input_table_name, SortingColumnName, output_table_name, openconnection):
cursor = openconnection.cursor()
threads = list()
for i in range(0, number_of_threads):
t = threading.Thread(target=create_tables, args=(
i, cursor, temp_table_name, input_table_name, SortingColumnName, minValue, minValue + partition_size))
threads.append(t)
t.start()
minValue += partition_size
for i in range(0, number_of_threads):
threads[i].join()
table_name = temp_table_name + str(i)
query = "insert into " + output_table_name + " select * from " + table_name
cursor.execute(query)
create_tables
is потоки функций вызывают при запуске.
def create_tables(index, cursor, temp_table_name, input_table_name, SortingColumnName, startRange, endRange):
new_table_name = temp_table_name + str(index)
query = "create table " + new_table_name + " (like " + input_table_name + " including all)"
cursor.execute(query)
if index == 0:
query = "insert into " + new_table_name + " select * from " + input_table_name + " where " + SortingColumnName + " >= " + str(
startRange) + " and " + SortingColumnName + " <= " + str(
endRange) + " order by " + SortingColumnName + " asc"
else:
query = "insert into " + new_table_name + " select * from " + input_table_name + " where " + SortingColumnName + " > " + str(
startRange) + " and " + SortingColumnName + " <= " + str(
endRange) + " order by " + SortingColumnName + " asc"
cursor.execute(query)
К сожалению, когда я запускал тест на машине windows (несколько раз), программа работала успешно без каких-либо проблем, и, следовательно, причина, по которой я не могу получить в свои руки в логах ошибки. Но есть некоторая ошибка, которую трудно воспроизвести.
Один из разработчиков сказал, что проблема заключается в отправке курсора, а не объекта соединения, и когда мы отправили объект соединения в функцию и создали курсор из объект, он работал без каких-либо проблем.
Я хотел бы знать, является ли объект подключения потокобезопасным, а курсор из объекта подключения - нет, и поэтому отправка объекта подключения потокам фактически решает проблему ?
Модифицированная create_tables
функция:
def create_tables(index, connection, temp_table_name, input_table_name, SortingColumnName, startRange, endRange):
cursor = connection.cursor()
...