我有多个客户端试图连接到/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运行这个程序。它适用于单个客户端,但任何其他客户端在发出GET /stream时都会被阻塞。
阻塞的原因是什么,我应该如何修复它?
我做了更多的尝试,得到了一些奇怪的结果。如果我做了这个手术,就会发生这样的事情:
发布于 2013-06-24 08:21:45
事实证明,这与我所测试的Chromium浏览器有关。由于某种原因,在第一次请求完成之前,它会推迟提出请求。使用curl或匿名浏览器会话允许同时运行多个会话。这意味着我的问题在现实中并不存在,只是因为铬同时处理对同一资源的请求。
我不知道为什么铬的行为是这样的,这似乎很奇怪。不管怎样,这不是一个真正的问题,只是我的浏览器看到的一个问题。
发布于 2013-07-19 02:55:31
我在Firefox中得到了类似的结果(正如我在评论中提到的那样),然后我转而在主块中使用WSGIServer,而不是使用gunicorn,一切都正常,超时已经过去(因为WSGIServer没有超时它的工作人员,但是WSGIServer有超时),所以我认为这是一个值得添加的答案。
添加以下内容:
if __name__ == '__main__':
http_server = WSGIServer(('127.0.0.1', 8001), app)
http_server.serve_forever()那就做吧
python app.py如果我使用Chris的命令行并将超时设置为99999,我就不会在30岁以后超时,但是会有很长的时间
https://stackoverflow.com/questions/17259534
复制相似问题