¡Nuevo y popular ecosistema asincrónico de Python Web!

Si cree que Python solo es popular en el campo de la ciencia de datos, ¡corrija su opinión! El desarrollo web de Python tiene un nuevo marco asincrónico, que es muy emocionante.

 

Actualmente, están sucediendo muchas cosas interesantes en el ecosistema de desarrollo web de Python, uno de los principales impulsores de este trabajo es ASGI (Asynchronous Standard Gateway Interface).

 

He mencionado ASGI muchas veces aquí, especialmente al anunciar Bocadillo y tartiflette-starlette, pero nunca me he tomado el tiempo para dar una introducción detallada a esta biblioteca. Entonces comienza ahora!

 

Este artículo está dirigido a personas interesadas en la última dirección del desarrollo web de Python. Presentaré en detalle qué es ASGI y cuál es la última tecnología de desarrollo web de Python.

 

Antes de comenzar, anunciaré por cierto que recientemente creé la página awesome-asgi, que es una lista muy completa que puede ayudar a las personas a comprender el ecosistema ASGI en expansión.

Puede ver actualizaciones sobre estas versiones de la biblioteca en la página.

 

Ok, ahora comencemos!

 

Todo comienza con la sintaxis asíncrona / espera

 

A diferencia de JavaScript o Go, Python no era un lenguaje que introdujo la ejecución asincrónica desde el principio. Durante mucho tiempo, solo puede usar subprocesos múltiples o multiprocesos, o confiar en otras bibliotecas de red asíncronas (como eventlet, gevent o Twisted) para lograr la ejecución concurrente de tareas en Python. (Ya en 2008, Twisted ya tenía interfaces de colaboración asíncronas, como inlineCallbacks y deferredGenerator).

 

Pero todo esto ha cambiado en Python 3.4+. Python 3.4 agregó asyncio a la biblioteca estándar, basada en generadores y rendimiento de la sintaxis, para lograr soporte para multitarea.

 

Más tarde, se agregó la sintaxis async / await en Python 3.5. Confiando en esta función gramatical, ahora implementamos una corutina nativa independiente de la capa inferior, que sienta las bases para la escritura de las bibliotecas de concurrencia de Python.

 

Desde el lanzamiento de 3.5, el desarrollo de bibliotecas asíncronas ha progresado rápidamente, y la comunidad ha estado realizando un procesamiento asincrónico en muchas bibliotecas. Si está interesado en comprender, puede ver muchos proyectos en aio-libs y awesome-asyncio.

 

Bueno, lo has adivinado, también significa que los servidores web y las aplicaciones de Python se están moviendo hacia la sincronización. De hecho, ¡todas las aplicaciones geniales están funcionando! (Incluso Django).

 

Descripción general de ASGI

 

Entonces, ¿cómo encaja ASGI en todo esto?

 

Desde una perspectiva más elevada, ASGI puede verse como una herramienta que permite que los servidores y aplicaciones asincrónicas de Python se comuniquen entre sí. Comparte muchas ideas de diseño con WSGI, y generalmente viene en forma de un sucesor asincrónico incorporado.

 

Este es el diagrama principal de este modelo:

En un nivel alto, ASGI es la interfaz de comunicación entre la aplicación y el servidor.

 

Pero en realidad, esto es mucho más complicado.

 

Para comprender el verdadero principio de funcionamiento de ASGI, veamos la especificación ASGI:

 

ASGI contiene dos componentes diferentes:

  • Un servidor de protocolo que termina el protocolo Socket y los convierte en conexiones y mensajes de eventos para cada conexión.
  • Una aplicación que reside en el servidor de protocolo, se instancia una vez por conexión y procesa el mensaje de evento cuando ocurre.

 

Por lo tanto, según la especificación, el punto real de ASGI es el formato del mensaje y cómo intercambiar estos mensajes entre la aplicación y el servidor de protocolo que lo ejecuta.

 

Ahora, podemos modificar el diagrama a una versión más detallada:

Cómo funciona el ASGI real

 

Obviamente, hay muchos detalles interesantes para mirar. Por ejemplo, puede ver las especificaciones de HTTP y WebSocket.

 

Además, aunque la especificación se centra en la comunicación entre el servidor y la aplicación, los hechos muestran que ASGI contiene más que eso.

 

Explicaremos esto más adelante, pero primero necesitamos hablar sobre conocimientos básicos ...

 

La base de ASGI

 

Ahora que entendemos cómo ASGI encaja en el ecosistema de la red Python, echemos un vistazo más de cerca al código específico.

 

ASGI se basa en un modelo de trabajo simple: cuando el cliente se conecta al servidor, instanciamos una aplicación. Luego, ingresamos los datos entrantes en la aplicación y luego enviamos todos los datos devueltos.

 

La "aplicación de entrada" mencionada aquí es en realidad un poco como llamar a la función para llamar a la aplicación, es decir, ingresar algunos datos y devolver los datos de salida.

 

De hecho, estas son todas las características de la aplicación ASGI invocable. Nuevamente, la forma de este objeto invocable está definida por la especificación ASGI. El formato es el siguiente:

 

 

La firma de esta función es el significado de "I" en ASGI: la aplicación debe implementar esta interfaz antes de que el servidor pueda llamarla.

 

Explica los tres parámetros:

  • El alcance es un diccionario que contiene información sobre las solicitudes entrantes. Los datos son diferentes de los datos entre las conexiones HTTP y WebSocket.
  • recibir es una función asincrónica utilizada para recibir mensajes de eventos ASGI.
  • send es una función asincrónica utilizada para enviar mensajes de eventos ASGI.

 

Esencialmente, estos parámetros le permiten recibir datos de recepción () y envío () en el canal de comunicación que se ejecuta en el servidor de protocolo, el canal se crea en este contexto.

 

No entiendo su opinión, pero la idea general y la forma de diseño de esta interfaz es muy adecuada para mi pensamiento. Es hora de mostrar el código de muestra.

 

¡Muéstrame tu código!

 

Para comprender la apariencia formal de ASGI de manera más práctica, creé un proyecto muy pequeño que muestra la aplicación HTTP ASGI nativa proporcionada por uvicorn (el popular servidor ASGI):

 

Aquí, usamos send () para enviar una respuesta HTTP al cliente: primero envíe el encabezado, luego envíe el cuerpo de la respuesta.

 

Ahora, con todos estos diccionarios y datos de bytes sin procesar, admitiré que usar ASGI nativo no es muy fácil de usar.

 

Afortunadamente, hay opciones más avanzadas: es hora de comenzar a hablar de Starlette.

 

Starlette es un excelente proyecto, y la OMI es la base del ecosistema ASGI.

 

En resumen, proporciona un conjunto de herramientas de componentes avanzados, como solicitudes y respuestas, que pueden usarse para abstraer ciertos detalles de ASGI. Por favor vea Hello World de Starlette:

 

 

Starlette tiene todas las funciones esperadas en el enrutamiento de framework web real, middleware, etc. Muestre un ejemplo simple para mostrar el verdadero encanto de ASGI, continúe mirando ...

 

"Tortugas todo abajo"

 

El concepto de cambio ecológico interesante y completo sobre ASGI es "Tortugas hacia abajo", que fue creado por la persona que emigró a Django y fue creado originalmente por Andrew Godwin, el transformador asíncrono de Django (¿tal vez?).

 

¿Pero qué significa eso?

 

Debido a que ASGI es un concepto abstracto, permite recibir y enviar datos en cualquier momento en un contexto determinado. Con esta idea, ASGI no solo se puede usar para intercambiar datos entre el servidor y la aplicación, sino también en la pila. Intercambie datos en cualquier lugar.

 

Por ejemplo, el objeto Starlette Response es en sí mismo una aplicación ASGI. De hecho, podemos simplificar la aplicación de muestra Starlette anterior de la siguiente manera:

 

 

¿Qué tan interesante es eso?

 

Pero espera, hay más.

 

El significado más profundo de "las tortugas hacia abajo" es que podemos construir varias aplicaciones, middleware, bibliotecas y otros proyectos, y asegurarnos de que todos puedan interactuar, siempre que todos implementen la interfaz del programa de aplicación ASGI.

 

(Además, según mi propia experiencia en la construcción de Bocadillo, usualmente (quizás siempre) usar la interfaz ASGI hará que el código sea más conciso).

 

Por ejemplo, podemos construir un middleware ASGI (es decir, una aplicación que envuelva otra aplicación) para mostrar cuándo se entregó la solicitud:

 

 

Para usarlo, solo necesitamos envolverlo en una aplicación ...

 

 

... funcionará mágicamente.

 

 

Sorprendentemente, TimingMiddleware puede envolver cualquier aplicación ASGI. Empaquetar aplicaciones internas también es muy simple y puede usarse para proyectos maduros y existentes (cientos de API y puntos finales WebSocket), sin importar qué tipo de proyecto, siempre que sea compatible con ASGI.

 

(Existe un middleware de temporización que es más adecuado para entornos de producción: timing-asgi).

 

¿Por qué debería importarme?

 

Aunque creo que la interoperabilidad es un importante punto de venta, existen muchas otras ventajas al crear aplicaciones web de Python utilizando componentes basados ​​en ASGI.

 

  • Velocidad: la naturaleza asíncrona de las aplicaciones y servidores ASGI los hace realmente rápidos (al menos para Python): estamos hablando de 60k-70k req / s (considerando que Flask y Django solo pueden alcanzar 10-20k en situaciones similares )
  • Características: El servidor y el marco ASGI le permiten acceder a funciones concurrentes existentes (WebSocket, eventos enviados por el servidor, HTTP / 2), y estas funciones no pueden implementarse usando sync / WSGI.
  • Estabilidad: ASGI ha existido como una especificación durante aproximadamente tres años, y la versión 3.0 generalmente se considera muy estable. Entonces, la parte básica del ecosistema se está estabilizando.

 

En términos de bibliotecas y herramientas, no creo que podamos decir que nos detenemos aquí. Sin embargo, debido a una comunidad muy activa, espero que el ecosistema ASGI pueda lograr un equilibrio funcional con el ecosistema tradicional de sincronización / WSGI.

 

¿Dónde puedo encontrar componentes que sean compatibles con ASGI?

 

De hecho, cada vez más personas están construyendo y mejorando proyectos basados ​​en ASGI. Incluyendo servidores y marcos web, pero también middleware y aplicaciones orientadas a productos, como Datasette.

 

Algunos de los componentes de framework no web que más admiro son:

  • Mangum: ASGI compatible con AWS Lambda
  • datasette-auth-github: aplicación ASGI para autenticación GitHub
  • tartiflette-starlette (¡este artículo lo escribí!): ASGI que admite Tartiflette, un motor GraphQL asíncrono.

Aunque se siente bien ver florecer el ecosistema, personalmente he sido difícil seguir todo el progreso.

 

Como escribí al comienzo de este artículo, creé Amazing-asgi exactamente por esta razón. Espero que ayude a todos a comprender todas las cosas emocionantes que suceden en el ecosistema ASGI. (Al ver que ha alcanzado casi 100 estrellas en pocos días, siento que es realmente necesario localizar y compartir recursos ASGI).

 

Resumen

 

Aunque parece una característica pequeña, creo que ASGI ha sentado las bases para una nueva era de desarrollo web de Python.

 

Si desea obtener más información sobre ASGI, consulte los diversos contenidos (artículos y conferencias) que figuran en awesome-asgi. Si desea participar, consulte cualquiera de los siguientes proyectos:

  • uvicorn: servidor ASGI.
  • Starlette: marco ASGI.
  • TypeSystem: validación de datos y representación de formularios
  • Bases de datos: biblioteca de base de datos asíncrona.
  • orm: ORM asíncrono.
  • HTTPX: un cliente HTTP asíncrono que admite llamadas a aplicaciones ASGI (utilizadas como cliente de prueba).

Estos proyectos son construidos y mantenidos por Encode (principalmente Tom Christie). Hay una discusión pública sobre el establecimiento de un equipo de mantenimiento de Encode, así que si está buscando oportunidades para promover el progreso de la fundación de código abierto, ¡mire aquí!

 

Disfruta tu viaje ASGI.

 

Supongo que te gusta

Origin www.cnblogs.com/Py1233/p/12691812.html
Recomendado
Clasificación