烧瓶 + SSE :为什么需要 time.sleep()



我正在构建一个烧瓶应用程序,该应用程序将具有后台进程(带有multiprocessing.Process)轮询Web服务以获取新数据,将数据排队,以便服务器发送事件端点可以将其流式传输到客户端。

示例代码如下:

#!/usr/bin/env python
from __future__ import print_function
import itertools
import time
from flask import Flask, Response, redirect, request, url_for
from multiprocessing import Process, Queue
def f(q):
    for i, c in enumerate(itertools.cycle('ABCDEFG')):
        time.sleep(1) 
        q.put( c )

app = Flask(__name__)
q = Queue()
@app.route('/')
def index():
    if request.headers.get('accept') == 'text/event-stream':
        def events():
            for i, c in enumerate(itertools.cycle('ABCDEFG')):
                #yield "data: %s nn" % (q.get())
                yield "data: %s nn" % (c)
                time.sleep(0.01)
        return Response(events(), content_type='text/event-stream')
    return redirect(url_for('static', filename='index.html'))

if __name__ == "__main__":
    p = Process(target=f, args=(q,))
    p.start()
    app.run(host='localhost', debug=True, port=23423)
    p.join()

问题是在Chrome中,如果我在yield后删除time.delay(0.01),SSE似乎挂起(客户端)。

time.sleep 是必需的,这样你的客户端就不会被消息淹没。否则,Python 循环将以循环的速度连续运行,发送消息。现在设置后,客户端每秒将收到大约 100 条消息(减去几条处理时间)。

相关内容

  • 没有找到相关文章

最新更新