WSGI asíncrono con Twisted

Estoy creando una interfaz web para una aplicación torcida y me gustaría usar WSGI en lugar de twisted.web directamente (ya que el rest del sitio web es WSGI y ya tengo una base de código WSGI sustancial).

La página de documentación retorcida que encontré sobre WSGIResource (http://twistedmatrix.com/documents/current/web/howto/web-in-60/wsgi.html) indica: Como cualquier otro contenedor WSGI, no puede hacer nada asíncrono. en sus aplicaciones WSGI, a pesar de que se trata de un contenedor WSGI Twisted.

¿Esto tiene que ser verdad? ¿Existe alguna forma menos que intrincada de hacer el manejo asíncrono de solicitudes web asíncronas de estilo twisted.web en WSGI, quizás como parte de otro proyecto de software libre? Suponiendo que no lo haya, mi plan es que los hilos WSGI realicen su trabajo asíncrono en el hilo del reactor y lo bloqueen por sondeo hasta que los datos estén disponibles. No es lindo.

Si hay una manera razonablemente sencilla de manejar asíncronamente las solicitudes de WSGI en forma retorcida, me encantaría escucharla.

¿Por qué quieres usar WSGI y hacer cosas asíncronas? La ventaja de WSGI es que puede implementar su aplicación en cualquier contenedor WSGI. Si empiezas a usar Twisted API para hacer cosas asíncronas, solo puedes implementar tu aplicación en el contenedor WSGI de Twisted.

Probablemente debería usar Twisted Web sin WSGI para su código asíncrono.

En principio, WSGI no es intrínsecamente incompatible con el diseño de progtwigs asíncronos; de hecho, PEP 333 tiene una longitud considerable para especificar cómo deben comportarse los servidores, las aplicaciones y el middleware para soportar ese tipo de cosas.

En el corazón de esto está el retorno de un iterador al contenedor. Cada vez que se invoca un wsgi app_iter asíncrono, verifica todas sus tareas asíncronas pendientes (conexiones de base de datos, etc.) y si alguna de ellas tiene datos, el app_iter produce algunos datos; de lo contrario, produce una cadena vacía. Para respaldar esto, un contenedor de wsgi deberá realizar un seguimiento de todas las solicitudes en vuelo, e iterar cada una de ellas para obtener más datos, además de atender cualquier otro trabajo diferido del que sea responsable.

En principio, muy pocas aplicaciones o marcos de trabajo de wsgi realmente hacen esto. casi invariablemente, los frameworks wsgi bloquean por todo tipo de razones; leer archivos desde el disco o cargar datos de una base de datos por cualquier motivo (la mayoría de los ORM hacen que este sea un problema difícil de evitar). El contenedor wsgi de Twisted funciona bajo el supuesto de que, como algunas aplicaciones de wsgi se bloquean, tal vez cualquier aplicación de wsgi pueda bloquear, y por lo tanto siempre los ejecuta en un hilo.

Hay dos cosas que puedes hacer; o bien explorar el propio marco web de twisted, que es bastante sólido; o considere la posibilidad de crear una envoltura de wsgi para retorcerse fuera del propio contenedor de twisted. Asegurarse de que la aplicación wsgi sea realmente asincrónica es ciertamente una condición previa para este último, pero el propio wsgi es bastante simple, una envoltura delgada sobre http, por lo que debería ser lo suficientemente fácil.