You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 00:24:57