Frasco con gevent multicore

¿Cuál es la forma clara de ejecutar la aplicación flask con el servidor backend gevent y utilizar todos los núcleos de procesador? Tengo la idea de ejecutar varias copias de la aplicación del matraz donde gevent WSGIServer escucha un puerto en diapason 5000..5003 (para 4 procesos) y nginx como equilibrador de carga.

Pero no estoy seguro de que esta manera sea la mejor y puede haber otras formas de hacerlo. Por ejemplo, el proceso maestro escucha un puerto y los trabajadores procesan las conexiones entrantes.

Voy a tomar un tiro!

Nginx!

sección del servidor:

location / { include proxy_params; proxy_pass http://127.0.0.1:5000; } 

Aplicación matraz

Esta es una aplicación de matraz simple que usaré para este ejemplo.

myapp.py:

 from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "Hello World!" if __name__ == "__main__": app.run() 

uWSGI

Bien, sé que dijiste que querías usar gevent, pero si estás dispuesto a comprometerte un poco, creo que estarías muy contento con esta configuración.

 [uwsgi] master = true plugin = python http-socket = 127.0.0.1:5000 workers = 4 wsgi-file = myapp.py callable = app 

Gunicorn

Si debes tener gevent te gustará esta pequeña configuración

config.py:

 import multiprocessing workers = multiprocessing.cpu_count() bind = "127.0.0.1:5000" worker_class = 'gevent' worker_connections = 30 

Entonces puedes correr:

 gunicorn -c config.py myapp:app 

Es cierto que tiene un trabajador para cada CPU y 30 conexiones por trabajador.

A ver si eso funciona para ti.

Si realmente está vendido usando nginx como un equilibrador de carga, intente algo como esto en su sección http

 upstream backend { server 127.0.0.1:5000; server 127.0.0.1:5002; server 127.0.0.1:5003; server 127.0.0.1:5004; } 

entonces uno de estos en la sección del servidor

 location / { include proxy_params; proxy_pass http://backend; } 

¡Buena suerte amigo!