Задний план:
Я работаю над проектом, который использует Django с базой данных Postgres. Мы также используем mod_wsgi в случае, если это имеет значение, так как некоторые из моих поисковых запросов упоминали об этом. При отправке веб-формы представление Django запускает работу, которая займет значительное количество времени (больше, чем хотелось бы ждать пользователю), поэтому мы запускаем работу с помощью системного вызова в фоновом режиме. Выполняемое задание должно иметь возможность чтения и записи в базу данных. Поскольку это задание занимает много времени, мы используем многопроцессорность для параллельного выполнения его частей.
Проблема:
У сценария верхнего уровня есть соединение с базой данных, и когда он порождает дочерние процессы, кажется, что соединение родителя доступно для детей. Затем есть исключение о том, как SET TRANSACTION ISOLATION LEVEL должен вызываться перед запросом. Исследования показали, что это происходит из-за попытки использовать одно и то же соединение с базой данных в нескольких процессах. Один поток, который я обнаружил, предлагал вызвать connection.close () в начале дочерних процессов, чтобы Django автоматически создавал новое соединение, когда оно ему нужно, и, следовательно, каждый дочерний процесс будет иметь уникальное соединение, то есть не разделяемое. У меня это не сработало, так как вызов connection.close () в дочернем процессе заставил родительский процесс пожаловаться на потерю соединения.
Другие результаты:
Некоторые вещи, которые я прочитал, похоже, указывают на то, что вы действительно не можете этого сделать, и что multiprocessing, mod_wsgi и Django плохо работают вместе. Мне кажется, в это трудно поверить.
Некоторые предлагали использовать сельдерей, что могло бы быть долгосрочным решением, но я не могу установить сельдерей в настоящее время, ожидая некоторых процессов утверждения, поэтому сейчас это не вариант.
Нашел несколько ссылок на SO и в других местах о постоянных соединениях с базой данных, что, по моему мнению, является другой проблемой.
Также нашел ссылки на psycopg2.pool и pgpool и кое-что о вышибале. По общему признанию, я не понимал большей части того, что читал по ним, но это определенно не бросалось мне в глаза как то, что я искал.
Текущий «Рабочий процесс»:
На данный момент я вернулся к последовательному запуску вещей, и это работает, но медленнее, чем хотелось бы.
Любые предложения относительно того, как я могу использовать многопроцессорную обработку для параллельной работы? Похоже, что если бы у меня был родитель и двое детей, которые имели бы независимые подключения к базе данных, все было бы хорошо, но я не могу получить такое поведение.
Спасибо и извините за длину!