Flask + SSE:为什么需要time.sleep()?

时间:2014-12-09 20:45:04

标签: python flask wsgi server-sent-events python-multiprocessing

我正在构建一个烧录应用程序,它将具有后台进程(使用multiprocessing.Process)轮询Web服务以获取新数据,对数据进行排队,以便Server-Sent-Events端点可以将其流式传输到客户端

示例代码如下:

#!/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 \n\n" % (q.get())
                yield "data: %s \n\n" % (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中,如果我在time.delay(0.01)之后移除yield,则SSE似乎挂起(客户端)。

1 个答案:

答案 0 :(得分:2)

time.sleep是必需的,因此您的客户不会被邮件淹没。否则,Python循环将以可循环的速度连续发送消息。正如您现在设置的那样,客户端每秒将收到大约100条消息(减去一些处理时间)。