首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >服务器发送了带有Flask/Redis的事件:多个客户端如何查看流?

服务器发送了带有Flask/Redis的事件:多个客户端如何查看流?
EN

Stack Overflow用户
提问于 2013-06-23 09:50:19
回答 2查看 2.7K关注 0票数 9

我有多个客户端试图连接到/stream上发送的服务器事件流。这适用于单个客户端,但如果试图连接更多的客户端,则会导致新客户端无限期地阻塞等待数据。如果我发送更多的数据,它只提供给第一个客户端,而不是其他客户端。

这里有一个小片段说明了我的问题:

代码语言:javascript
复制
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时都会被阻塞。

阻塞的原因是什么,我应该如何修复它?

我做了更多的尝试,得到了一些奇怪的结果。如果我做了这个手术,就会发生这样的事情:

  • 启动客户端1(只有客户端1接收数据)
  • 启动客户端2(只有客户端1接收数据)
  • 启动客户端3(只有客户端1接收数据)
  • 启动客户端4(只有客户端1接收数据)
  • 重新启动客户端1(所有4个客户端突然同时开始接收数据)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-24 08:21:45

事实证明,这与我所测试的Chromium浏览器有关。由于某种原因,在第一次请求完成之前,它会推迟提出请求。使用curl或匿名浏览器会话允许同时运行多个会话。这意味着我的问题在现实中并不存在,只是因为铬同时处理对同一资源的请求。

我不知道为什么铬的行为是这样的,这似乎很奇怪。不管怎样,这不是一个真正的问题,只是我的浏览器看到的一个问题。

票数 3
EN

Stack Overflow用户

发布于 2013-07-19 02:55:31

我在Firefox中得到了类似的结果(正如我在评论中提到的那样),然后我转而在主块中使用WSGIServer,而不是使用gunicorn,一切都正常,超时已经过去(因为WSGIServer没有超时它的工作人员,但是WSGIServer有超时),所以我认为这是一个值得添加的答案。

添加以下内容:

代码语言:javascript
复制
if __name__ == '__main__':
http_server = WSGIServer(('127.0.0.1', 8001), app)
http_server.serve_forever()

那就做吧

代码语言:javascript
复制
python app.py

如果我使用Chris的命令行并将超时设置为99999,我就不会在30岁以后超时,但是会有很长的时间

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17259534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档