Saltar al contenido

Matraz tubo roto con solicitudes

Solución:

Ejecute su aplicación de matraz en un servidor WSGI adecuado capaz de manejar solicitudes concurrentes (tal vez gunicorn o uWSGI) y funcionará. Durante el desarrollo, habilite los subprocesos en el servidor proporcionado por Flask con:

app.run(threaded=True)

pero tenga en cuenta que el servidor Flask no se recomienda para uso en producción. A partir del frasco 1.0, threaded está habilitado de forma predeterminada y desea utilizar el flask comando en la línea de comando, realmente, para ejecutar su aplicación.

Lo que sucede es que al usar solicitudes estás haciendo un segundo solicitud a su aplicación de matraz, pero como todavía está ocupada procesando la primera, no responderá a esta segunda solicitud hasta que haya terminado con esa primera solicitud.

Por cierto, en Python 3, la implementación del servidor de sockets maneja la desconexión con más gracia y continúa funcionando en lugar de fallar.

Hay varias cosas en juego aquí, y trataré de abordarlas una por una.

Primero, probablemente estés usando el servidor de desarrollo de juguetes. Este servidor tiene muchas limitaciones; La principal de estas limitaciones es que solo puede manejar una solicitud a la vez. Cuando crea una segunda solicitud durante su primera solicitud, está bloqueando su aplicación: requests.post() La función está esperando que Flask responda, pero el propio Flask está esperando post() ¡regresar! La solución a este problema en particular es ejecutar su aplicación WSGI en un entorno multiproceso o multiproceso. Prefiero http://twistedmatrix.com/trac/wiki/TwistedWeb para esto, pero hay varias otras opciones.

Con eso fuera del camino … Esto es un antipatrón. Es casi seguro que no desee invocar toda la sobrecarga de una solicitud HTTP solo para compartir algunas funciones entre dos vistas. Lo correcto es refactorizar para tener una función separada que haga ese trabajo compartido. Realmente no puedo refactorizar su ejemplo particular, porque lo que tiene es muy simple y ni siquiera merece dos vistas. ¿Qué querías construir exactamente?

Editar: un comentario pregunta si el modo multiproceso en el servidor de juguete stdlib sería suficiente para evitar que se produzca el interbloqueo. Voy a decir “tal vez”. Sí, si no hay dependencias que impidan que ambos subprocesos progresen, y ambos subprocesos progresan lo suficiente para finalizar sus tareas de red, las solicitudes se completarán correctamente. Sin embargo, determinar si dos subprocesos se bloquearán entre sí es indecidible (la prueba se omite como obtusa) y no estoy dispuesto a decir con certeza que el servidor stdlib pueda hacerlo bien.

El error que causó el accidente fue corregido en la versión 0.12, Lanzado el 21 de diciembre de 2016. ¡Sí! Esta es una solución importante que muchos han estado esperando.

Desde el registro de cambios del matraz:

  • Revertir un cambio de comportamiento que hizo que el servidor de desarrollo se bloqueara en lugar de devolver un error interno del servidor (solicitud de extracción n. ° 2006).
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *