Perché Gevent su un'app a fiaschetta con Apache + Mod_SGI sta aumentando NotimplementeDeReRorror?
Domanda
Sto avendo un problema Distribuzione della mia app di pallone con Apache (Mod_SGI) e Gevent su un hosting condiviso (WebFaction).
L'applicazione funziona bene nel server di sviluppo fornito da Bock, ma quando io Prova a distribuirlo, ricevo il seguente errore nel file di 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
.
Ho bisogno di Gevent perché sto usando il Python-Richiesta il modulo Async a Crea richieste http concorrenti. Ho provato a Google in giro ma l'unico consiglio che ho trovato è quello di chiamare
from gevent import monkey
monkey.patch_all()
.
qualcosa che faccio già nel mio codice.
Il valore del WSGIDaemonProcess
è:
WSGIDaemonProcess myapp processes=5 python-path=/home/myusername/webapps/myapp/lib/python2.7 threads=1
.
Ecco il mio httpd.conf: http://pastebin.com/ewygicjh
Qualcuno ha qualche consiglio per risolvere questo problema?
Soluzione
Sembra che abbia trovato la soluzione da solo.La seguente direttiva ha risolto il mio problema:
WSGIApplicationGroup %{GLOBAL}
.
L'idea proviene da un altro Risposta Dove si consiglia di impostare WsgiaplicationGroup per risolvere un problema con un processo WSGIche continuano a schiantarsi. dalla documentazione WSGI :
.Per forzare una specifica applicazione WSGI da eseguire entro il primo Python Sub Interprete creato quando Python è inizializzato, il La direttiva wsgiaplicationgroup dovrebbe essere utilizzata e il gruppo impostato su '% {Global}'.
non può capire completamente perché questa direttiva risolve il mio problema ma lo fa.Sarò più che felice se qualcuno è in grado di spiegarmi questo in inglese semplice; -)
Altri suggerimenti
Prova a sostituire monkey.patch_all()
con monkey.patch_all(thread=False)
.Se è davvero il modulo di threading che sta causando il problema quando si è rattoppato, questo dovrebbe risolverlo.request
non usa il threading.
Ho pubblicato sotto risposta su https://serverfault.com/a/869625/355861
Apache Mod_WSGI non è attualmente compatibile con Gevent.Per Aws Elastic Beanstalk con Apache, ho usato ASYNC_MODE="Threading" per Bock e funziona bene.Nota, la filettatura ha meno prestazioni di Gevent. https://flansk-somkeketio.readthedocs.io/en/latest/#Deillment
app = Flask(__name__,static_folder='static')
socketio = SocketIO(app, async_mode="threading")
.
Nota che il pallone può eseguire standalone 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)
.
Tuttavia, vuoi davvero un server HTTP davanti ad esso come Gunicorn.