Недавно я переключил некоторые фоновые функции программного обеспечения, над которым я работаю, с помощью многопроцессорного модуля многопроцессорного модуля Python для использования преимуществ большего количества ядер ЦП.Большая часть переноса прошла без проблем, но интеграция с базой данных доставила мне существенную проблему.
Изначально я использовал один объект SimpleConnectionPool из Python psycopg2, который содержался как глобальная переменная в модуле с именем db, которыйтакже обрабатывает некоторые стандартные операции с базой данных.Насколько я понимаю, создание второго процесса Python просто копирует текущий стек памяти в новое местоположение процесса.Поскольку это вызывает проблемы с соединениями с базой данных, я добавил функцию под названием init () в мой модуль db, которая просто повторно инициализирует SimpleConnectionPool и устанавливает его в глобальную переменную.Я думал, что если бы я вызвал эту функцию init из второго процесса, он создал бы новый набор соединений только для пула во вторичном процессе.Следовательно, основной процесс будет поддерживать свой собственный набор соединений, отдельный от второго процесса.
Однако, используя этот метод, я часто получал следующее исключение:
OperationalError: SSL error: decryption failed or bad record mac
Это произошлонепосредственно из "state = conn.poll ()" в psycopg2_patcher.py.Я немного покопался, и, насколько я могу судить, ошибка возникает только в том случае, если и основной процесс, и дополнительный процесс пытаются выполнить запрос одновременно.Я думал о том, чтобы просто вернуться к одному пулу соединений в главном процессе и использовать очереди для передачи запросов от вторичного процесса к основному процессу для выполнения.Однако из-за этого у меня много головной боли.
Я также попытался отойти от пулов соединений во вторичном процессе и использовал одно соединение, которое устанавливается только тогда, когда требуется выполнить запрос, изатем закрыли сразу после.Та же ошибка произошла, когда основной процесс пытался выполнить запрос примерно в одно и то же время.
Что мне нужно сделать с сервером PGSQL или моей реализацией, чтобы разные процессы могли отправлять запросы одновременно с одинаковыми учетными данными?У меня такое ощущение, что я использую связи с базами данных между процессами совершенно ненужным и запутанным способом.