2011-07-20 16 views
7

Estoy construyendo una interfaz web para una aplicación retorcida y me gustaría usar WSGI en lugar de twisted.web directamente (ya que el resto del sitio web es WSGI y ya tengo una base de código WSGI sustancial).WSGI asíncrono con Twisted

La página de documentación trenzado que encontré sobre WSGIResource (http://twistedmatrix.com/documents/current/web/howto/web-in-60/wsgi.html) afirma: Al igual que cualquier otro recipiente WSGI, se no puede hacer nada asincrónico en sus aplicaciones WSGI, aunque este es un contenedor Twisted WSGI.

¿Esto tiene que ser cierto? ¿Hay alguna manera menos que hacky de hacer un manejo asíncrono de solicitudes web twisted.web en WSGI, quizás como parte de otro proyecto de software libre? Suponiendo que no exista, mi plan es que los hilos WSGI hagan su trabajo asíncrono en la rosca del reactor y bloqueen por sondeo hasta que los datos estén disponibles. No es lindo.

Si hay una forma razonablemente sencilla de manejar asincrónicamente solicitudes de WSGI en twisted, me encantaría escucharla.

+1

Ejecutar wsgi con threadpool torcido en bastante fácil, ver http://stackoverflow.com/questions/5248825/web-interface-for-a-twisted-application –

+0

Por lo que vale, en realidad me gusta 'twistd web' para contenedores wsgi en producción. Es más fácil de configurar que 'cherryd' y es un poco más ágil y mucho más duradero que Apache + mod_wsgi. – SingleNegationElimination

Respuesta

5

¿Por qué quieres usar WSGI y hacer cosas asincrónicas? El beneficio de WSGI es que puede implementar su aplicación en cualquier contenedor de WSGI. Si comienza a usar las API retorcidas para hacer cosas asincrónicas, entonces solo puede implementar su aplicación en el contenedor WSGI de Twisted.

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

+1

Este es un componente de una aplicación de Internet basada en WSGI más grande, la única parte que necesita trabajar con retorcido, así que esperaba evitar mucha reescritura de ese marco basado en WSGI. De todos modos, tienes razón, voy a usar vainilla Twisted Web en su lugar. –

+1

También puede usar vailing Twisted Web para llamar a la misma base de código que también tiene una interfaz WSGI. Realmente, Twisted Web es solo un par de métodos - 'getChild',' render_GET', 'render_POST' - que implementa para exponer su aplicación. Por lo tanto, tendrá que escribir un pequeño código de pegamento en el límite, pero no debería necesitar volver a escribir todo desde cero solo para usar esa interfaz. – Glyph

5

En principio, WSGI no es intrínsecamente incompatible con el diseño de programa asíncrono; de hecho, PEP 333 es bastante extenso 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á devolviendo un iterador al contenedor. Cada vez que se invoca un wsgi app_iter asíncrono, verificaría todas sus tareas asíncronas pendientes (conexiones a la base de datos, etcétera) y si alguno de ellos tiene datos, el app_iter arroja algunos datos; de lo contrario, produce una cadena vacía. Para sustentar esto, un contenedor de wsgi necesitaría hacer un seguimiento de todas las solicitudes en vuelo, y repetirlas cada una para obtener más datos, además de dar servicio a cualquier otro trabajo diferido del que sea responsable.

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

Hay dos cosas que puede hacer; o explore el propio framework web de twisted, que es bastante sólido; o considere crear una envoltura wsgi para retorcerse fuera del contenedor propio de Twisted. Asegurarse de que la aplicación wsgi sea realmente sincrónica es sin duda una condición previa de la última, pero wsgi en sí es bastante simple, una envoltura delgada sobre http, por lo que debería ser lo suficientemente fácil.