如何给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
相关产品推荐
相关产品推荐

