Передача Postgresql объекта соединения против курсора в потоки в Python - PullRequest
0 голосов
/ 31 марта 2020

Я создал функцию для выполнения запроса к БД в 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()
    ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...