2015-07-27 8 views
11

Używam Django na serwerze Ubuntu z nginxem i gunicornem. Próbuję zrobić kilka procesów, które działają na mojej lokalnej maszynie, ale zawiesza się, dopóki pracownik gunicorn nie przekroczy czasu na moim serwerze.Python multiprocessing Pool zawiesza się na serwerze ubuntu

cpu_count = int(multiprocessing.cpu_count()) 
pool = Pool(processes = cpu_count) 
result = pool.map_async(apiSimulAvail, rate_ranges) 
result.wait() 

...do some more stuff once all processes return 

Zawiesza się pod numerem pool = Pool(processes = cpu_count). Nie dostaję żadnych błędów, pracownik gunicorn po prostu przekracza limit czasu i uruchamia się ponownie.

Wszelkie wskazówki, dlaczego tak się dzieje i/lub jak mogę je rozwiązać, są bardzo mile widziane. Dzięki.

+0

Czy uruchomiłeś wątki przed rozpoczęciem tych procesów? –

+0

Nie w tym widoku. – apardes

+0

Co masz na myśli "ten widok"? Jeśli proces się zawiesza, może to być spowodowane tym, że odziedziczył on zły stan synchronizacji od procesu rodzica, dziadka lub pradziadka. Najlepszym, być może jedynym sposobem, aby się upewnić, że to się nigdy nie stanie, jest to, aby nigdy nie rozpoczynać procesów po uruchomieniu jakichkolwiek wątków. –

Odpowiedz

0

Zmień

pool = Pool(processes = cpu_count) 

do

pool = Pool(cpu_count) 

ta zakłada, że ​​już od importowanych Pool wieloprocesorowe inaczej trzeba zrobić

multiprocessing.Pool(cpu_count) 
+0

Doceń sugestię, ale powoduje to ten sam problem. Działa na moim komputerze lokalnym, ale zawiesza się na moim serwerze. – apardes

+0

Czy masz tę samą wersję python na obu komputerach? – russOnXMaps

+0

Nie, mój komputer lokalny ma 2.7.5, a serwer 2.7.6. Przeglądając uwagi do wydania 2.7.6 wygląda na to, że wszystkie poprawki błędów nie widzę nic, co wskazywałoby na to, że stworzyło nowy problem. – apardes

3

To wydaje się być odmianą na Using python's Multiprocessing makes response hang on gunicorn, więc prawdopodobnie jest to dupe.

Powiedziałeś, że musisz korzystać z wieloprocesowości (MP)? Można uczciwie lepiej obsłużyć hodowlę niż coś takiego jak Seler. MP może zostać zabity wraz z gunicorn worker, gdy umiera, ponieważ jest właścicielem procesu MP. W zależności od konfiguracji serwera może się to zdarzyć dość często. Jeśli masz bardzo długotrwałą pracę, możesz ją wyhodować do Selera, to tylko trochę więcej konfiguracji.

+0

Django i Gunicorn nie nadają się do długotrwałego połączenia, więc +1 na sugestię Celery. Jeśli zadanie jest długie, nie powinno blokować połączenia (i powinno być wykonywane w innym miejscu). Jeśli zadanie jest krótkie ... to po co zawracać sobie głowę procesem wieloprocesorowym? – MariusSiuram

1

Czy używasz jakiegoś asynchronicznego pracownika Gunicorn? Jeśli tak, spróbuj użyć domyślnego narzędzia do synchronizacji i sprawdź, czy możesz odtworzyć problem.

Jeśli problem można odtworzyć tylko podczas korzystania z asynchronicznych pracowników, należy upewnić się, że moduł multiprocessing jest poprawnie załatany.

+0

Nie jestem pewien, czy dostałem twoją odpowiedź. Co rozumiesz przez łatanie modułu wieloprocesowego? –

+0

Wygląda na to, że ma to związek z geventem, którego używałem jako klasy robotniczej dla gunicorn. Usunięcie tego rozwiązuje co najmniej problem zawieszania. Masz pomysł, jak sprawić, by działało z gevent? –

Powiązane problemy