[英]Server sent events with Flask/Redis: how can more than one client view a stream?
我有多個客戶端嘗試連接到/stream
的服務器發送事件/stream
。 這適用於單個客戶端,但嘗試連接任何其他客戶端會導致新客戶端無限期地阻塞等待數據。 如果我發送更多數據,它只會發送給第一個客戶端,而不會發送給其他客戶端。
這是一個小片段,說明了我的問題:
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"
)
然后我用gunicorn --worker-class=gevent -w 4 -t 99999 app:app
運行gunicorn --worker-class=gevent -w 4 -t 99999 app:app
。 它適用於單個客戶端,但在發出GET /stream
時會阻止任何其他客戶端。
阻止的原因是什么,我該如何解決?
我調試了一點,得到了一些奇怪的結果。 如果我執行此過程,則會發生以下情況:
事實證明,這與我正在測試的Chromium Web瀏覽器有關。 由於某種原因,它會在第一個請求完成之前停止發出請求。 使用curl
或隱身瀏覽器會話允許多個會話同時運行。 這意味着我的問題實際上並不存在,只是因為Chromium處理對同一資源的同時請求的方式。
我不確定Chromium為什么會這樣,這看起來很奇怪。 無論哪種方式,這不是一個真正的問題,只有我的瀏覽器感知到的問題。
我在Firefox中得到了類似的結果(正如我在評論中提到的那樣)然后我切換到在主要塊中使用WSGIServer而不是gunicorn並且一切正常,超時已經消失(因為WSGIServer不會超時其工作人員但是gunicorn會這樣做)所以我認為這值得添加作為答案。
添加這個:
if __name__ == '__main__':
http_server = WSGIServer(('127.0.0.1', 8001), app)
http_server.serve_forever()
然后就做
python app.py
[如果我使用了Chris的命令行並將超時設置為99999,那么30秒后我就不會超時了,但之后會有更長的時間]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.