Pourquoi gevent sur une application Flask avec Apache + mod_wsgi génère NotImplementedError ?

StackOverflow https://stackoverflow.com//questions/9692089

Question

J'ai un problème pour déployer mon application FLASK avec Apache (MOD_WSGI) et Gevent sur un hébergement partagé (WebFaction).

L'application fonctionne bien dans le serveur de développement fourni par Flask, mais lorsque j'essaie de le déployer, je reçois l'erreur suivante dans le fichier journal:

[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

J'ai besoin de gevent parce que j'utilise le module asynchrone de python-requests Pour faire des demandes HTTP simultanées.J'ai essayé de chercher sur Google mais le seul conseil que j'ai trouvé est d'appeler

from gevent import monkey
monkey.patch_all()

quelque chose que je fais déjà dans mon code.

La valeur de WSGIDaemonProcess est:

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

Voici mon httpd.conf : http://pastebin.com/eWygicJH

Quelqu'un a-t-il des conseils pour résoudre ce problème ?

Était-ce utile?

La solution

Il semble que j'ai trouvé la solution moi-même.La directive suivante a résolu mon problème :

WSGIApplicationGroup %{GLOBAL}

L'idée vient d'un autre répondre où il est suggéré de définir WSGIApplicationGroup sur GLOBAL pour résoudre un problème avec un processus WSGI qui continue de planter. À partir de la documentation WSGI:

Pour forcer une application WSGI spécifique à être exécutée dans le tout premier sous-interpréteur Python créé lorsque Python est initialisé, la directive WSGIPPLICATIONGROUP doit être utilisée et le groupe défini sur '% {global}'.

Je ne comprends pas entièrement pourquoi cette directive résout mon problème, mais c'est le cas.Je serai plus qu'heureux si quelqu'un peut m'expliquer cela dans un anglais simple ;-)

Autres conseils

Essayez de remplacer monkey.patch_all() avec monkey.patch_all(thread=False).Si c'est vraiment le module de thread qui pose problème lors du patch, cela devrait le résoudre. request n'utilise pas de filetage.

J'ai posté la réponse ci-dessous sur https://serverfault.com/a/869625/355861

apache mod_wsgi n'est actuellement pas compatible avec gevent.Pour AWS Elastic Beanstalk avec Apache, j'ai utilisé async_mode="threading" pour Flask et cela fonctionne bien.Notez que le threading a moins de performances que gevent.https://flask-socketio.readthedocs.io/en/latest/#deployment

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

Notez que Flask peut fonctionner de manière autonome avec gevent.

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)

Cependant, vous voulez vraiment un serveur HTTP devant, tel que Gunicorn.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top