我们知道 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 在连接断开的时候调用自定义的清理函数?
def queue_consumer():
conn = 创建连接() #连接到消息队列 rabbitmq,创建 channel
try:
for data in conn.读取数据():
yield b"data: "+data+b"\n\n" #结束的时候会触发GeneratorExit异常
except:
pass
关闭连接()
@app.route("/stream")
def stream():
consumer = queue_consumer()
res = Response(consumer, mimetype="text/event-stream")
def onclose():
consumer.close()
res.call_on_close(onclose)
return res
1
yingxiangyu 2020-04-28 23:20:32 +08:00 1
yield 接收一个值,调用 send 传进去个特定值终止协程,断开链接的时候 send 值进去应该可以
|