如何在 Flask 服务器发送事件的生成器中配置 gunicorn 和 gevent 以实现睡眠功能?
How to configure gunicorn and gevent for sleep function inside a generator for Flask Server-Sent Events?
我正在使用这个生成器函数来实现服务器发送的事件:
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 秒间隔内收到的十条消息被立即转储。
我假设这与我 运行宁 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;
来源:First Google Hit for "nginx server sent events" (SO answer)
我正在使用这个生成器函数来实现服务器发送的事件:
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 秒间隔内收到的十条消息被立即转储。
我假设这与我 运行宁 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;
来源:First Google Hit for "nginx server sent events" (SO answer)