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