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