首页 > 解决方案 > mod_wsgi 中的服务器发送事件 (SSE) 阻塞线程

问题描述

我的烧瓶应用程序实现了 SSE 以将更新推送给我的每个用户。即我的每个用户都获得了单独的更新,因此获得了唯一的 SSE 连接。我将应用程序部署到 mod_wsgi。现在 mod_wsgi 允许我使用固定数量的线程(默认为 15),当用户数量增加时,这些线程很快就会全部阻塞。这发生在 SSE 连接保持打开并因此阻塞线程时。后续请求无法再进入,我收到Script timed out before returning headers: wsgi.py错误消息。

我目前的解决方法是在我的 SSE 生成器中放置一个计时器,并在某个阈值后将其中断。尽管如此,对于许多用户来说,固定数量的线程仍然会导致请求被阻塞。

def stream():
    ...
    queue = memory.get(...)

    @stream_with_context
    def eventStream():
        try:
            start = time.time()
            while True:
                delta = start - time.time()
                if delta > app.config["SSE_TIMEOUT"]:
                    break
                # wait for source data to be available, then push it
                try:
                    entry = queue.get(
                        True, timeout=app.config["SSE_TIMEOUT"] - delta)
                except Empty:
                    break
                ev = ServerSentEvent(json.dumps(entry))
                yield ev.encode()
        finally:
            ...

    return Response(eventStream(), mimetype="text/event-stream")

我希望找到一个干净的解决方案,能够处理任意数量的用户,这些用户能够通过 SSE 接收更新,而不会阻塞 wsgi 中的所有线程。

我也在 modwsgi 的邮件列表中发布了这个问题:https ://groups.google.com/forum/m/#!topic/modwsgi/-7he0l7KlU8

标签: multithreadingflaskmod-wsgiwsgiserver-sent-events

解决方案


推荐阅读