Flask-Sock路由断开前仍执行最后一次循环的问题求助
解决Flask-Sock WebSocket循环中sleep期间断开连接仍执行最后一次的问题
问题根源在于time.sleep()是阻塞式调用,当客户端断开连接时,服务器正处于睡眠状态,无法立即感知连接变化,必须等sleep结束后才会继续执行循环逻辑,导致多跑一次循环体。
以下是两种可行的解决方案:
方案1:用带超时的receive()替代time.sleep()
利用websocket.receive(timeout)实现等待,同时在等待过程中检测连接状态。如果连接断开,receive()会直接抛出异常,我们可以捕获异常终止循环:
from flask import Flask from flask_sock import Sock app = Flask(__name__) socket = Sock(app) @socket.route('/example') def example(websocket): try: while True: print('RAN') # 超时10秒等待消息,无消息时超时但不报错;连接断开时直接抛出异常 websocket.receive(timeout=10) except Exception: # 捕获连接断开异常,退出循环 print("连接已断开")
方案2:用ping()检测连接并实现等待
通过发送ping包来验证连接状态,同时设置超时时间替代sleep,一旦连接断开,ping()会抛出异常,从而终止循环:
from flask import Flask from flask_sock import Sock app = Flask(__name__) socket = Sock(app) @socket.route('/example') def example(websocket): while True: print('RAN') try: # 发送ping包,超时10秒,连接断开时触发异常 websocket.ping(timeout=10) except Exception: # 连接断开,退出循环 break
为什么之前的try-except+布尔值无效?
原来的代码中没有任何检测连接状态的操作,time.sleep()不会感知连接断开,只有当后续执行WebSocket相关操作(如send/receive)时才会触发异常。而你的循环逻辑是先执行print再sleep,所以sleep期间断开连接后,sleep结束会再次执行print,直到遇到WebSocket操作才会触发异常,导致最后一次循环执行。
内容的提问来源于stack exchange,提问作者Jiehfeng
相关产品推荐
相关产品推荐

