Многопроцессорная обработка и соединения с базой данных Django

Предыстория:

Я работаю над проектом, в котором используется Django с базой данных Postgres. Мы также используем mod_wsgi в случае, если это имеет значение, поскольку некоторые из моих поисковых запросов упоминали об этом. При отправке веб-формы представление Django запускает работу, которая займет значительное время (больше, чем пользователь хотел бы ждать), поэтому мы начинаем работу с помощью системного вызова в фоновом режиме. Выполняемое задание должно иметь возможность чтения и записи в базу данных. Поскольку это задание занимает много времени, мы используем многопроцессорность для параллельного выполнения его частей.

Проблема:

У скрипта верхнего уровня есть соединение с базой данных, и когда он порождается дочерними процессами, кажется, что соединение родителя доступно потомкам. Затем есть исключение о том, как SET TRANSACTION ISOLATION LEVEL должен вызываться перед запросом.Исследования показали, что это происходит из-за попытки использовать одно и то же соединение с базой данных в нескольких процессах. Один поток, который я обнаружил, предлагал вызвать connection.close () в начале дочерних процессов, чтобы Django автоматически создавал новое соединение, когда оно ему нужно, и поэтому каждый дочерний процесс будет иметь уникальное соединение, то есть не разделяемое. У меня это не сработало, так как вызов connection.close () в дочернем процессе заставил родительский процесс пожаловаться на потерю соединения.

Другие результаты:

Некоторые вещи, которые я прочитал, похоже, указывают на то, что на самом деле вы не можете этого сделать, и что многопроцессорность, mod_wsgi и Django плохо сочетаются друг с другом. Мне кажется, в это трудно поверить.

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

Нашел несколько ссылок на SO и в других местах о постоянных соединениях с базой данных, что я считаю другой проблемой.

Также были обнаружены ссылки на psycopg2.pool и pgpool и кое-что о вышибале. По общему признанию, я не понимал большей части того, что читал по ним, но это определенно не бросалось мне в глаза как то, что я искал.

Текущий "обходной путь":

На данный момент я вернулся к последовательному запуску вещей, и это работает, но медленнее, чем хотелось бы.

Есть какие-нибудь предложения относительно того, как я могу использовать многопроцессорную обработку для параллельной работы? Похоже, если бы у меня был родитель и двое детей, которые имели бы независимые подключения к базе данных, все было бы хорошо, но я не могу получить такое поведение.

Спасибо и извините за длину!

79
задан daroo 23 November 2011 в 13:18
поделиться