簡體   English   中英

服務器使用Flask / Redis發送事件:多個客戶端如何查看流?

[英]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時會阻止任何其他客戶端。

阻止的原因是什么,我該如何解決?

我調試了一點,得到了一些奇怪的結果。 如果我執行此過程,則會發生以下情況:

  • 啟動客戶端1(僅客戶端1接收數據)
  • 啟動客戶端2(僅客戶端1接收數據)
  • 啟動客戶端3(僅客戶端1接收數據)
  • 啟動客戶端4(僅客戶端1接收數據)
  • 重啟客戶端1(所有4個客戶端突然開始同時接收數據)

事實證明,這與我正在測試的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM