Как выполнять параллельные запросы с использованием мультипроцессорного пула и cx_oracle - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь запустить несколько процессов, используя python Pool, каждый процесс будет запрашивать базу данных, поэтому я пытаюсь передать соединение каждому процессу, а затем запускаю новый курсор для выполнения запроса

db = DBConnection()

sessoion_pool, cursor= db.get_session_pool()
connection = sessoion_pool.acquire()

part_list = [e for l in get_parts_list() for e in l]

pool = Pool()
pool.map(scan_part_best_model, (part_list, connection))

пока он продолжает выдавать TypeError: can't pickle cx_Oracle.Connection objects Я также пытался сделать то же самое для Session и использовать session.acquire() в функции logi c, но выдает ту же ошибку

1 Ответ

1 голос
/ 14 апреля 2020

Соединения не могут быть разделены между процессами. Однако вы можете выполнять параллельные запросы в одном и том же процессе, используя код, подобный следующему:

pool = cx_Oracle.SessionPool(USER, PASSWORD, DSN, min=5, max=20, increment=5)

def do_query(part_num):
    with pool.acquire() as conn:
        cursor = conn.cursor()
        cursor.execute("select some_stuff from some_table where part_num = :1",
                [part_num])
        print("Fetched part information for part", part_num)

threads = [threading.Thread(target=do_query, args=(p,)) for p in get_parts_list()]
for t in threads:
    t.start()
for t in threads:
    t.join()

После того, как вы получили данные из базы данных, если у вас есть значительная работа, вы можете передать извлеченные данные данные для подпроцессов через многопроцессорность, чтобы сделать эту работу. Вы просто не можете выполнять какую-либо работу с базой данных в подпроцессе - по крайней мере, без предварительного подключения к этому подпроцессу.

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