如何为Flask Server发送的事件在生成器内部配置gunicorn和gevent以实现睡眠功能?

问题描述 投票:0回答:1

我正在使用此生成器功能来实现服务器发送的事件:

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变量。

python gunicorn nonblocking server-sent-events gevent
1个回答
0
投票

经过两天的尝试后,发现必须为服务器发送的事件更改nginx配置。

仅添加这三行就可以了:

proxy_set_header Connection '';
proxy_http_version 1.1;
chunked_transfer_encoding off;

来源:First Google Hit for "nginx server sent events" (SO answer)

© www.soinside.com 2019 - 2024. All rights reserved.