Mam wielu klientów próbujących połączyć się ze strumieniem wysyłanych zdarzeń serwera pod numerem /stream
. Działa to z pojedynczym klientem, ale próba połączenia kolejnych klientów powoduje, że nowy klient staje się bezterminowo zablokowany, czekając na dane. Jeśli wyślę więcej danych, przejdzie ona tylko do pierwszego klienta, a nie do innych.Zdarzenia wysłane przez serwer za pomocą Flask/Redis: w jaki sposób więcej niż jeden klient może oglądać strumień?
Oto mały fragment, który ilustruje mój problem:
import flask
import time
app = flask.Flask(__name__)
def event_stream():
for i in xrange(9999):
yield "data: %d\n\n" % i
time.sleep(1)
@app.route("/stream", methods=[ "GET" ])
def stream():
return flask.Response(
event_stream(),
mimetype="text/event-stream"
)
I następnie uruchomić ten z gunicorn --worker-class=gevent -w 4 -t 99999 app:app
. Działa dla pojedynczego klienta, ale wszystkie inne są blokowane podczas wydawania GET /stream
.
Jaka jest przyczyna blokady i jak ją naprawić?
I debugowałem trochę więcej i otrzymałem dziwne wyniki. Jeśli zrobię tę procedurę, to się dzieje:
- klient start 1 (tylko klient 1 odbieranie danych)
- klient Rozpocznij 2 (tylko klient 1 odbieranie danych)
- start klient 3 (tylko klient 1 odbiorczy danych)
- klient start 4 (tylko klient 1 odbieranie danych)
- klient Restart 1 (wszystkie 4 klienci nagle zacząć odbierać dane w tym samym czasie)
http://stackoverflow.com/questions/13386681/streaming-data-with-python-and-flask – farzad
@farzad Ten przykład również cierpi z powodu tego problemu. –