python - 如何在 Flask 服务器发送事件的生成器中配置 gunicorn 和 gevent 以实现睡眠功能?
问题描述
我正在使用这个生成器函数来实现服务器发送的事件:
def event_stream():
while True:
gevent.sleep(3)
yield 'data: some data\n\n'
...并像这样返回它:
return Response(event_stream(), mimetype='text/event-stream')
如果我使用time.sleep(3)
而不是gevent.sleep(3)
,它会阻止其他所有内容(如预期的那样)。因此,当我gevent
在本地使用和运行 Flask 应用程序时,它运行良好。
但是,当我在远程服务器上运行它时,它不会像我在本地运行应用程序时那样以 3 秒的间隔发送消息,而是似乎继续堆积消息,以便当我按Ctrl+C结束服务器,所有不断堆积的消息都会在客户端一次转储。
因此,在没有任何消息的情况下等待大约 30 秒后,当我终止远程服务器时,应该在 3 秒间隔内收到的 10 条消息立即被转储。
我假设这与我的跑步方式有关gunicorn
。这是我当前启动服务器的方式:
gunicorn -c config.py server:app -k gevent
配置文件中唯一配置的是bind
变量。
解决方案
经过两天的尝试,结果发现必须为 Server-Sent Events 更改 nginx 配置。
只需添加这三行就可以了:
proxy_set_header Connection '';
proxy_http_version 1.1;
chunked_transfer_encoding off;
推荐阅读
- python - Django REST Framework NOT NULL 约束失败
- javascript - TypeError:无法读取 React 组件中未定义的属性“fetchAll”
- react-native - 了解 react-native-reanimated 执行
- ios - SizeToFit() 不能与 \n 一起正常工作?
- c++ - C++ 是否可以编排基类相对于其派生类的偏移量?
- python-3.x - 使用输入从python运行exe文件并保存输出
- java - Map-Reduce
pair Key 是一个时间间隔 - python - 在 pandas DataFrame 中使用多个条件会产生 ValueError
- repository - TYPO3 Persistence Repository 在视图渲染中抛出错误
- vim-plugin - 如何使用 vim-plug 安装 cscope_maps?