Pregunta

Tengo un problema de implementación de mi aplicación Flask con Apache (MOD_WSGI) y Gevent en un alojamiento compartido (WebFaction).

La aplicación funciona bien en el servidor de desarrollo proporcionado por Flask, pero cuando intento implementarla recibo el siguiente error en el archivo de registro:

[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

Necesito gevent porque estoy usando el módulo asíncrono de solicitudes de Python Para realizar solicitudes HTTP simultáneas.Intenté buscar en Google pero el único consejo que encontré es llamar

from gevent import monkey
monkey.patch_all()

algo que ya hago en mi código.

El valor de WSGIDaemonProcess es:

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

Aquí está mi httpd.conf: http://pastebin.com/eWygicJH

¿Alguien tiene algún consejo para resolver este problema?

¿Fue útil?

Solución

Parece que encontré la solución yo mismo.La siguiente directiva resolvió mi problema:

WSGIApplicationGroup %{GLOBAL}

La idea viene de otra Responder Donde se sugiere que configure WSGiAplicationGroup a Global para resolver un problema con un proceso de WSGIque sigue estrellando. de la documentación de WSGI :

para forzar una aplicación WSGI específica para correr dentro de la primera Python Sub Intérprene creado cuando Python se inicializa, el Se debe utilizar la directiva de WSGIACPLIGRAUTEGROUP y el grupo establecido para '% {Global}'.

no puede entender completamente por qué esta directiva resuelve mi problema, pero lo hace.Seré más que feliz si alguien puede explicarme esto en inglés simple; -)

Otros consejos

Intenta reemplazar monkey.patch_all() con monkey.patch_all(thread=False).Si realmente es el módulo de subprocesos el que está causando el problema cuando se parchea, esto debería resolverlo. request no utiliza hilo.

Publicé a continuación Responder en https://serverfault.com/a/869625/355861

apache mod_wsgi no es actualmente compatible con gevent.Para AWS Elastic Beanstalk con Apache, utilicé async_mode="roscado" para el matraz y funciona bien.Nota, el roscado tiene menos rendimiento que GEVENT. https://flask-socketio.readthedocs.io/en/latest/#Deploy

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

Tenga en cuenta que el matraz puede funcionar independiente con 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)

Sin embargo, realmente desea un servidor HTTP frente a él como Gunicorn.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top