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

如何给Python websocket流设置定时器实现运行1分钟后自动停止

可行实现方案

你当前使用的websocket.WebSocketApp属于同步运行的实现,和asyncio异步模型不兼容,这是你之前用asyncio尝试失败的核心原因。以下是两种可直接落地的方案:

方案1:threading定时器实现(改造成本最低,适配现有代码)

不需要修改你已经写好的消息、关闭回调逻辑,只需要增加一个独立线程的定时器,到时间主动关闭websocket连接即可:

import websocket
import threading

# 原有回调函数保持不变
# def on_message(ws, message):
#     ...
# def on_close(ws, close_status_code, close_msg):
#     ...

# 新增关闭连接的方法
def auto_close(ws):
    print("运行满1分钟,主动关闭WebSocket连接")
    ws.close()

# 原有实例化逻辑不变
ws = websocket.WebSocketApp(socket, on_message=on_message, on_close=on_close)

# 启动60秒定时器
close_timer = threading.Timer(60, auto_close, args=(ws,))
close_timer.start()

# 启动WebSocket服务
ws.run_forever()

# 若WebSocket提前断开,取消未执行的定时器避免资源残留
close_timer.cancel()
  • 优点:完全不侵入原有正常运行的业务逻辑,没有异步适配成本,稳定性高
  • 注意:定时器是独立子线程运行,不会阻塞WebSocket的消息接收流程

方案2:异步实现(适配后续异步架构需求)

如果需要对接异步业务逻辑,可以替换为异步WebSocket库websockets实现:

import asyncio
import websockets

async def run_ws(duration=60):
    try:
        async with websockets.connect(socket) as ws:
            # 消息接收逻辑替换为你原有on_message的实现
            async def recv_msg():
                while True:
                    msg = await ws.recv()
                    print(f"收到消息:{msg}")
            # 绑定超时时间
            await asyncio.wait_for(recv_msg(), timeout=duration)
    except asyncio.TimeoutError:
        print("运行满1分钟,关闭连接")

asyncio.run(run_ws())

内容的提问来源于stack exchange,提问作者Websocket User

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 14:15:08