barplot - Long Polling en Python con Frasco
pandas plot (1)
Tal como lo mencionó el enlace @ Robᵩ, la aplicación del matraz está sobrecargada. Esto se debe a que una aplicación de matraz se encuentra en modo de subprocesamiento único de forma predeterminada cuando se ejecuta con app.run()
, por lo que solo puede servir una solicitud por vez.
Puede iniciar múltiples subprocesos con:
if __name__ == ''__main__'':
app.run(threaded=True)
O usando un servidor WSGI como gunicornio o uwsgi para servir un matraz con procesamiento múltiple:
gunicorn -w 4 myapp:app
¡Espero que estés disfrutando con Python y Flask!
Estoy tratando de hacer largas encuestas con JQuery y Python bajo el Flask Framework.
Después de haber realizado una encuesta larga en PHP, he tratado de hacerlo de la misma manera:
Un script / función que tiene un ciclo while (verdadero), verifica cambios periódicamente, por ejemplo, cada 0,5 segundos en la base de datos, y devuelve algunos datos cuando ocurre un cambio.
Así que en mi ini .py he creado una aplicación.ruta a / encuesta para que JQuery llame. JQuery le da cierta información sobre el estado actual del cliente, y la función poll () compara esto con lo que está actualmente en la base de datos. El ciclo finaliza y devuelve información cuando se observa un cambio.
Aquí está el código python:
@app.route(''/poll'')
def poll():
client_state = request.args.get("state")
#remove html encoding + whitesapce from client state
html_parser = HTMLParser.HTMLParser()
client_state = html_parser.unescape(client_state)
client_state = "".join(client_state.split())
#poll the database
while True:
time.sleep(0.5)
data = get_data()
json_state = to_json(data)
json_state = "".join(data) #remove whitespace
if json_state != client_state:
return "CHANGE"
El problema es que, cuando el código anterior comienza a sondear, el servidor parece estar sobrecargado y otras llamadas Ajax, y otras solicitudes, como cargar una imagen de "carga" en el html utilizando JQuery, no responden y se agota el tiempo de espera.
Para completar, he incluido el JQuery aquí:
function poll() {
queryString = "state="+JSON.stringify(currentState);
$.ajax({
url:"/poll",
data: queryString,
timeout: 60000,
success: function(data) {
console.log(data);
if(currentState == null) {
currentState = JSON.parse(data);
}
else {
console.log("A change has occurred");
}
poll();
},
error: function(jqXHR, textStatus, errorThrown) {
console.log(jqXHR.status + "," + textStatus + ", " + errorThrown);
poll();
}
});
}
¿Esto necesita multihilo o algo así? ¿O alguien tiene alguna idea de por qué estoy experimentando este comportamiento?
¡¡Gracias por adelantado!! :)