Perché Gevent su un'app a fiaschetta con Apache + Mod_SGI sta aumentando NotimplementeDeReRorror?

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

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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top