首页 > 解决方案 > 如何在 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变量。

标签: pythongunicornnonblockingserver-sent-eventsgevent

解决方案


经过两天的尝试,结果发现必须为 Server-Sent Events 更改 nginx 配置。

只需添加这三行就可以了:

proxy_set_header Connection '';
proxy_http_version 1.1;
chunked_transfer_encoding off;

资料来源:“nginx 服务器发送事件”的第一次 Google 命中(SO 回答)


推荐阅读