multithreading - 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
解决方案
推荐阅读
- python - QWebEngine 初始化后注册对象
- dialogflow-es - DialogFlow 与 Twilio 文本消息的集成
- android - Kotlin,即使条件为假,代码也会进入 if statemant
- c - 从文件中获取单词并将它们与另一个文件中的文本进行比较
- python - 如何知道我的 Python 程序是否支持所有 Python 版本?点子
- php - 将 flatpickr(kt datapicker) 与 PHP 一起使用。时间禁用
- java - 没有名为 'mongoTemplate' 的 bean 可用
- python - 我不明白“.year:”如何在“datetime.datetime.today().year”行代码中工作
- c# - Autofac 依赖注入 - 数据不保存到数据库
- search - 在 BST 中搜索节点时出现问题。(来自 gfg)