La investigación principal en este documento es que Flask implementa la función de solicitud de no bloqueo asíncrono, y la implementación específica es la siguiente.
Recientemente, cuando estaba trabajando en un proyecto IoT, necesitaba construir un servidor HTTP sin bloqueo asincrónico. Después de buscar información, descubrí que podía usar el paquete Gevent.
Gevent es una biblioteca de red concurrente de Python que utiliza Greenlets basadas en bucles de eventos Libevent para proporcionar una API de sincronización avanzada. Aquí hay un ejemplo de código:
Desde gevent.wsgi import wsgiserver de su aplicación importación apphttp_server = wsgiserver (('', 5000), app) http_server.serve_forever ()A continuación se muestra una lista de códigos asíncronos sin bloqueo de frascos, y lo transmite directamente cuando sea necesario en el futuro.
# codificación = UTF-8# Python Versión: 3.5.1# FlaskFrom Flask Import Mlask, solicitud, G# GeventFrom Gevent Importo MonkeyFrom Gevent.pywsgi Import wsgiservermonkey.patch_all ()# gevent endimport timepp = Flask (__ name __) app.config.update(debug=true)@app.route ('/asyn/', métodos = ['get']) def test_asyn_one (): print ("Asyn tiene una solicitud") Time.sleep (10) return 'Hello asyn'@app.route ('/test/', Methods = [' get ']) Def: Test' __name__ == "__main__": # app.run () http_server = wsgiserver ((('', 5000), app) http_server.serve_forever ()¿Por qué agregar la declaración MONKEY.PATCH_ALL ()? Hay una explicación detallada en el sitio web oficial de Gevnet, aquí hay una breve explicación:
Monkey reemplaza cuidadosamente las funciones y clases en el módulo de enchufe estándar con sus contrapartes cooperativas. De esa manera, incluso los módulos que no son conscientes de Gevent pueden beneficiarse al ejecutar en un entorno de múltiples greenlet.
Traducción: Monkey Patch reemplaza cuidadosamente las funciones y clases de módulos de socket estándar con copias de código paralelo. De esta manera, el módulo puede permitir que el Gevent funcione mejor en el entorno de múltiples greenletes sin saberlo.
Abra el navegador, primero solicite http://127.0.0.1:5000/asyn/, y luego solicite http://127.0.0.1:5000/test/ esta interfaz diez veces. Si se trata de un marco general de frasco, la interfaz posterior no responderá.
El contenido de impresión es el siguiente:
¡Asyn tiene una solicitud!
127.0.0.1 - - [2016-10-24 20:45:10] "Get/test/http/1.1" 200 126 0.000000
127.0.0.1 - - [2016-10-24 20:45:11] "Get/test/http/1.1" 200 126 0.000000
127.0.0.1 - - [2016-10-24 20:45:11] "Get/test/http/1.1" 200 126 0.000000
127.0.0.1 - - [2016-10-24 20:45:12] "Get/test/http/1.1" 200 126 0.000000
127.0.0.1 - - [2016-10-24 20:45:12] "Get/test/http/1.1" 200 126 0.000998
127.0.0.1 - - [2016-10-24 20:45:13] "Get/test/http/1.1" 200 126 0.001001
127.0.0.1 - - [2016-10-24 20:45:14] "Get/test/http/1.1" 200 126 0.000000
127.0.0.1 - - [2016-10-24 20:45:14] "Get/test/http/1.1" 200 126 0.001014
127.0.0.1 - - [2016-10-24 20:45:15] "Get/test/http/1.1" 200 126 0.001000
127.0.0.1 - - [2016-10-24 20:45:15] "Get/test/http/1.1" 200 126 0.000000
127.0.0.1 - - [2016-10-24 20:45:18] "Get/asyn/http/1.1" 200 126 10.000392
Lo anterior es todo el contenido de este artículo sobre la implementación de Flask del análisis de instancias de función de solicitud de solicitud sin bloqueo asíncrono, espero que sea útil para todos. Los amigos interesados pueden continuar referiéndose a otros temas relacionados en este sitio. Si hay alguna deficiencia, deje un mensaje para señalarlo. ¡Gracias amigos por su apoyo para este sitio!