Передумови:
Я працюю над проектом, який використовує Django з базою даних Postgres. Ми також використовуємо mod_wsgi на випадок, коли це важливо, оскільки деякі мої пошукові запити в Інтернеті згадували про це. Під час подання веб-форми подання Django запускає роботу, яка займе значну кількість часу (більше, ніж користувач хотів би зачекати), тому ми починаємо роботу за допомогою системного дзвінка у фоновому режимі. Завдання, яке виконується зараз, має мати можливість читати та записувати в базу даних. Оскільки ця робота триває так довго, ми використовуємо багатопроцесорну обробку, щоб паралельно запускати її частини.
Проблема:
Сценарій верхнього рівня має підключення до бази даних, і коли він породжує дочірні процеси, здається, що батьківський зв’язок доступний для дітей. Тоді є виняток щодо того, як НАБІР РІВНЯ ІЗОЛЯЦІЇ ОПЕРАЦІЙ повинен викликатися перед запитом. Дослідження показали, що це пов’язано зі спробою використовувати одне і те ж підключення до бази даних у кількох процесах. Один потік, який я знайшов, пропонував викликати connection.close () на початку дочірніх процесів, щоб Django автоматично створив нове з'єднання, коли йому це потрібно, і тому кожен дочірній процес матиме унікальне з'єднання - тобто не буде спільним. Це не спрацювало для мене, оскільки виклик connection.close () у дочірньому процесі змусив батьківський процес скаржитися на те, що зв’язок втрачено.
Інші висновки:
Деякі речі, які я прочитав, вказували на те, що ви насправді цього не можете зробити, а багатопроцесорність, mod_wsgi та Django погано грають разом. Напевно, здається, у це важко повірити.
Деякі пропонували використовувати селеру, що може бути довгостроковим рішенням, але наразі я не можу встановити селеру, очікуючи деяких процедур затвердження, тому зараз це не варіант.
Знайшов кілька посилань на SO та в інших місцях щодо постійних з'єднань з базами даних, що, на мою думку, є іншою проблемою.
Також знайдено посилання на psycopg2.pool та pgpool та щось про вишибалу. Слід визнати, що я не розумів більшості того, що читав на цих темах, але це, звичайно, не стрибало на мене як на те, що я шукав.
Поточне "усунення":
Наразі я повернувся до простого запуску речей послідовно, і це працює, але повільніше, ніж хотілося б.
Будь-які пропозиції щодо того, як я можу використовувати багатопроцесорну роботу для паралельного запуску? Здається, якби я міг мати батьків і двох дітей, всі вони мали незалежні підключення до бази даних, все було б нормально, але я, здається, не маю такої поведінки.
Дякую, і вибачте за довжину!