Frage

Ich habe ein Problem, das meine Flask -App mit Apache (mod_wsgi) und Gevent für ein freigegebenes Hosting (WebFaction) bereitstellt.

Die Anwendung funktioniert in dem von Flask bereitgestellten Entwicklungsserver gut. Wenn ich jedoch versuche, sie bereitzustellen, erhalte ich den folgenden Fehler in der Protokolldatei:

[Tue Mar 13 15:48:24 2012] [error] Traceback (most recent call last):
[Tue Mar 13 15:48:24 2012] [error]   File "evdns.pxi", line 78, in gevent.core.__evdns_callback (gevent/core.c:6300)
[Tue Mar 13 15:48:24 2012] [error]   File "/home/username/.virtualenvs/staging/lib/python2.7/site-packages/gevent/hub.py", line 297, in switch_args
[Tue Mar 13 15:48:24 2012] [error]   File "/home/username/.virtualenvs/staging/lib/python2.7/site-packages/gevent/hub.py", line 290, in switch
[Tue Mar 13 15:48:24 2012] [error]   File "/home/username/.virtualenvs/staging/lib/python2.7/site-packages/gevent/hub.py", line 135, in get_hub
[Tue Mar 13 15:48:24 2012] [error] NotImplementedError: gevent is only usable from a single thread

Ich brauche gevent, weil ich das verwende Async-Modul von Python-Requests gleichzeitige HTTP -Anfragen zu stellen.Ich habe versucht, bei Google herumzustöbern, aber der einzige Rat, den ich gefunden habe, ist, anzurufen

from gevent import monkey
monkey.patch_all()

etwas, das ich bereits in meinem Code mache.

Der Wert von WSGIDaemonProcess Ist:

WSGIDaemonProcess myapp processes=5 python-path=/home/myusername/webapps/myapp/lib/python2.7 threads=1

Hier ist meine httpd.conf: http://pastebin.com/eWygicJH

Hat jemand einen Rat zur Lösung dieses Problems?

War es hilfreich?

Lösung

Es scheint, als hätte ich die Lösung selbst gefunden.Die folgende Anweisung hat mein Problem gelöst:

WSGIApplicationGroup %{GLOBAL}

Die Idee kommt von einem anderen Antwort Hier wird empfohlen, WSGIApplicationGroup auf GLOBAL zu setzen, um ein Problem mit einem WSGI-Prozess zu lösen, der ständig abstürzt. Aus der WSGI-Dokumentation:

Um eine bestimmte WSGI -Anwendung innerhalb des ersten Python -Sub -Interpreters zu erzwingen, das bei der Initialisierung von Python erstellt wurde, sollte die WSGIApplicationGroup -Anweisung verwendet und die Gruppe auf '%{global}' eingestellt werden.

Ich kann nicht ganz verstehen, warum diese Richtlinie mein Problem löst, aber sie löst es.Ich würde mich sehr freuen, wenn mir das jemand in einfachem Englisch erklären kann ;-)

Andere Tipps

Versuchen Sie es mit einem Austausch monkey.patch_all() mit monkey.patch_all(thread=False).Wenn es beim Patchen wirklich das Threading-Modul ist, das das Problem verursacht, sollte dies die Lösung sein. request verwendet kein Threading.

Ich habe unten eine Antwort gepostet https://serverfault.com/a/869625/355861

Apache mod_wsgi ist derzeit nicht mit gevent kompatibel.Für AWS Elastic Beanstalk mit Apache habe ich async_mode="threading" für Flask verwendet und es funktioniert gut.Beachten Sie, dass Threading weniger Leistung bringt als Gevent.https://flask-socketio.readthedocs.io/en/latest/#deployment

app = Flask(__name__,static_folder='static')
socketio = SocketIO(app, async_mode="threading") 

Beachten Sie, dass Flask eigenständig mit gevent ausgeführt werden kann.

app = Flask(__name__,static_folder='static')
socketio = SocketIO(app, async_mode="gevent") 

if __name__ == '__main__':
    HOST = '127.0.0.1'
    PORT = 5055
    socketio.run(app, port=PORT, host=HOST)

Sie möchten jedoch unbedingt einen HTTP-Server wie Gunicorn davor haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top