Лайфхаки в аудите

Выполнение параллельных запросов в Python с использованием модуля Multiprocessing

Время прочтения: 2 мин.

В таком случае можно использовать приложения, позволяющие формировать и исполнять запросы без необходимости загружать информацию в базу данных, например, используя Python. Недостаток такого подхода в том, что для каждой записи требуется формировать запрос — т.е. для набора из тысячи записей потребуется сформировать и запустить тысячу запросов, что займет много времени.

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

import multiprocessing as mp
import pyodbc
serv = pyodbc.connect(‘подключение’)

Приведён список используемых модулей. После импорта модулей нам потребуется создать подключение к серверу.

def get_data(a):
    cur = serv.cursor()
    cur.execute(‘select * from table where id = ?’, a)
    res = cur.fetchall()
    cur.close()
    return res

Далее объявляем функцию, которая будет выполнять загрузку одного «блока» исходных данных. В ней мы используем открытое в корне файла соединение для создания курсора к серверу, выполняем запрос с переменными, в который передаётся значение для подстановки на место переменной, и возвращаем полученный результат:

def multiload (data):
    with (mp.Pool(4)) as p:
        results = zip(p.map(get_data, data))
        return list(results)

И, наконец, объявляем функцию для создания потоков, которая формирует несколько процессов (в данном примере — четыре), и распределяет по ним передаваемый в функцию набор данных. Полученный .py файл необходимо сохранить, под именем, например, Multiprocess_example.py. В другом .py файле, в свою очередь, требуется импортировать этот файл по сохраненному имени, и вызвать ранее написанную функцию multiload, в которую передаются требуемые для поиска значения:

import Multiprocess_example
list_id = [1,2,3,4,5]
Multiprocess_example.multiload(list_id)

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

Советуем почитать