[英]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.