2015-07-27 2 views
11

Ich bin Django auf einem Ubuntu-Server mit Nginx und Gunicorn laufen. Ich versuche einige Multiprocessing zu machen, die auf meiner lokalen Maschine funktioniert, aber hängt, bis der Gunicorn-Arbeiter auf meinem Server abläuft.Python Multiprocessing-Pool hängt auf Ubuntu-Server

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 

Es hängt an pool = Pool(processes = cpu_count). Ich bekomme keine Fehler, der Gunicorn-Mitarbeiter kommt gerade raus und bootet neu.

Jeder Hinweis darauf, warum dies geschieht und/oder wie ich es lösen kann, wird sehr geschätzt. Vielen Dank.

+0

Haben Sie irgendwelche Threads gestartet, bevor Sie diese Prozesse gestartet haben? –

+0

Nicht in dieser Ansicht. – apardes

+0

Was meinst du mit "dieser Ansicht"? Wenn ein Prozess aufhört, könnte dies daran liegen, dass er den fehlerhaften Synchronisierungsstatus von einem übergeordneten oder übergeordneten Prozess oder von einem übergeordneten Prozess geerbt hat. Der beste, möglicherweise einzige Weg, um sicherzustellen, dass dies nie passieren kann, besteht darin, Prozesse niemals zu starten, nachdem irgendwelche Threads gestartet wurden. –

Antwort

0

ändern

pool = Pool(processes = cpu_count) 

zu

pool = Pool(cpu_count) 

Dies setzt voraus, dass Sie Pool von Multiprozessing sonst importiert haben müssen Sie

multiprocessing.Pool(cpu_count) 
+0

Schätzen Sie den Vorschlag, aber das führt zu demselben Problem. Läuft auf meinem lokalen Rechner, hängt aber auf meinem Server. – apardes

+0

Haben Sie auf beiden Rechnern dieselbe Python-Version? – russOnXMaps

+0

Nein, meine lokale Maschine hat 2.7.5, während der Server 2.7.6 hat. Wenn ich mir die Versionshinweise für 2.7.6 anschaue, sieht es aus wie alle Fehlerbehebungen und ich sehe nichts, was darauf hindeutet, dass es ein neues Problem verursacht hat. – apardes

3

Dies scheint zu sein, eine Variation tun auf Using python's Multiprocessing makes response hang on gunicorn so möglicherweise ist dies ein Betrogener.

Das heißt, müssen Sie Multiprocessing (MP) verwenden? Du könntest ehrlich gesagt besser bedient werden, wenn du das auf etwas wie Sellerie ausarbeitest. MP könnte mit dem Gunicorn-Arbeiter getötet werden, wenn er stirbt, da er den MP-Prozess besitzt. Abhängig von der Serverkonfiguration kann das ziemlich häufig passieren. Wenn Sie einen sehr langen Job haben, können Sie das immer noch mit Sellery machen, es ist nur ein bisschen mehr Konfiguration.

+0

Django und Gunicorn sind für eine langlebige Verbindung nicht geeignet, also +1 auf den Sellerievorschlag. Wenn die Aufgabe lang ist, sollte sie die Verbindung nicht blockieren (und sollte an anderer Stelle erfolgen). Wenn die Aufgabe kurz ist, warum sollte man sich dann mit Multiprocessing beschäftigen? – MariusSiuram

1

Verwenden Sie Async-Gunicorn-Worker? Ist dies der Fall, versuchen Sie den standardmäßigen Synchronisierungs-Worker, und prüfen Sie, ob Sie das Problem reproduzieren können.

Wenn das Problem nur reproduziert werden kann, wenn asynchrone Worker verwendet werden, sollten Sie sicherstellen, dass das Modul multiprocessing richtig gepatcht ist.

+0

Ich bin mir nicht sicher, ob ich deine Antwort bekommen habe. Was meinst du mit Patch-Multiprocessing-Modul? –

+0

Es sieht so aus, als ob es mit Gevent zu tun hat, das ich als Arbeiterklasse für Gunicorn benutzt habe. Entfernen das behebt das hängenden Problem mindestens. Irgendeine Idee, wie es mit gevent funktioniert? –