如何让 Python 放弃长时间没读取的 yield?或者说 Flask 的 EventSource 如何在浏览器断开连接的时候释放资源?

2020-04-28 23:08:58 +08:00
 cy97cool

我们知道 flask 可以简单的做一个 EventSource: https://stackoverflow.com/questions/12232304/how-to-implement-server-push-in-flask-framework

def queue_consumer():
    conn = 创建连接() #连接到消息队列 rabbitmq,创建 channel
    for data in conn.读取数据():
        yield b"data: "+data+b"\n\n"
    关闭连接() # 怎么执行到?

@app.route("/stream")
def stream():
    return Response(queue_consumer(), mimetype="text/event-stream")

问题来了,当浏览器断开连接的时候,这个 queue_consumer 函数并不知道它自己应该结束,表现为没人再去执行这个 yield 连接就会一直保持着,资源(channel)没有释放

问:如何让 Python 放弃长时间(比如说 1 分钟)没能被读到的 yield ? 或者说怎么让 Flask 在连接断开的时候调用自定义的清理函数?

1085 次点击
所在节点    问与答
1 条回复
yingxiangyu
2020-04-28 23:20:32 +08:00
yield 接收一个值,调用 send 传进去个特定值终止协程,断开链接的时候 send 值进去应该可以

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/667111

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX