Tło:
Pracuję nad projektem, który używa Django z bazą danych Postgres. Używamy również mod_wsgi na wypadek, gdyby miało to znaczenie, ponieważ niektóre z moich wyszukiwań w Internecie wspominały o tym. Po przesłaniu formularza internetowego widok Django uruchamia zadanie, które zajmie znaczną ilość czasu (więcej niż użytkownik chciałby czekać), więc rozpoczynamy zadanie poprzez wywołanie systemowe w tle. Zadanie, które jest teraz uruchomione, musi mieć możliwość odczytu i zapisu w bazie danych. Ponieważ to zadanie trwa tak długo, używamy przetwarzania wieloprocesowego do równoległego uruchamiania jego części.
Problem:
Skrypt najwyższego poziomu ma połączenie z bazą danych i kiedy uruchamia się z procesów potomnych, wydaje się, że połączenie rodzica jest dostępne dla dzieci. Następnie istnieje wyjątek dotyczący tego, jak należy wywołać ustawienie POZIOM IZOLACJI TRANSAKCJI przed zapytaniem. Badania wykazały, że jest to spowodowane próbą użycia tego samego połączenia z bazą danych w wielu procesach. Jeden wątek, który znalazłem, sugerował wywołanie connection.close () na początku procesów potomnych, aby Django automatycznie utworzyło nowe połączenie, gdy będzie to potrzebne, a zatem każdy proces potomny będzie miał unikalne połączenie - tj. Nie będzie współdzielone. To nie zadziałało dla mnie, ponieważ wywołanie connection.close () w procesie potomnym spowodowało, że proces nadrzędny skarżył się, że połączenie zostało utracone.
Inne ustalenia:
Niektóre rzeczy, które przeczytałem, zdawały się wskazywać, że tak naprawdę nie możesz tego zrobić, a przetwarzanie wieloprocesowe, mod_wsgi i Django nie współpracują dobrze. Wydaje mi się, że trudno w to uwierzyć.
Niektórzy sugerowali użycie selera, co może być rozwiązaniem długoterminowym, ale w tej chwili nie mogę zainstalować selera w oczekiwaniu na procesy zatwierdzania, więc nie jest to teraz opcja.
Znalazłem kilka odniesień w SO i innych miejscach na temat trwałych połączeń z bazą danych, co moim zdaniem stanowi inny problem.
Znalazłem również odniesienia do psycopg2.pool i pgpool oraz coś o bouncer. Wprawdzie nie rozumiałem większości z tego, co czytałem na nich, ale z pewnością nie wyskoczyło mi to jako to, czego szukałem.
Bieżące „Obejście”:
Na razie wróciłem do uruchamiania rzeczy po kolei i to działa, ale jest wolniejsze niż bym chciał.
Jakieś sugestie, w jaki sposób mogę równolegle korzystać z przetwarzania wieloprocesowego? Wygląda na to, że gdybym mógł mieć rodzica i dwoje dzieci, wszyscy mieliby niezależne połączenia z bazą danych, wszystko byłoby w porządku, ale nie mogę uzyskać takiego zachowania.
Dzięki i przepraszam za długość!