如何实现WebSocket数据的非阻塞式处理?
实现WebSocket非阻塞接收的几种方法
嘿,这个问题我太熟了!默认的ws.recv()确实会死死卡住程序,直到收到数据为止,完全没法并行处理其他逻辑。我给你分享几个实际能用的非阻塞实现方案,你可以根据自己的项目场景选:
方法一:设置接收超时时间
这是最直接的解决方案,给recv()设置一个超时时间,要是在指定时间内没收到数据,就会抛出超时异常,我们捕获这个异常后就能继续执行其他代码了。
from websocket import create_connection import websocket url = 'ws://example.com' ws = create_connection(url) # 设置1秒超时,你可以根据需求调整时长 ws.settimeout(1) try: data = ws.recv() # 这里处理收到的数据 print(f"收到新数据:{data}") except websocket.WebSocketTimeoutException: # 没收到数据时,执行你的其他业务逻辑 print("暂无WebSocket数据,继续处理其他任务")
方法二:用select监听套接字状态
如果你的程序需要同时处理多个网络连接,用select模块监听WebSocket底层套接字的可读性会更灵活。它能一次性检查多个套接字的状态,不会让程序卡在某一个连接上。
from websocket import create_connection import select url = 'ws://example.com' ws = create_connection(url) # 获取WebSocket对应的底层套接字对象 ws_socket = ws.sock # 监听套接字是否可读,超时时间设为1秒 readable_sockets, _, _ = select.select([ws_socket], [], [], 1) if readable_sockets: # 此时调用recv()不会阻塞,因为已经有数据可读了 data = ws.recv() print(f"收到数据:{data}") else: # 没有新数据,执行其他逻辑 print("没有WebSocket消息,继续运行其他代码")
方法三:使用异步WebSocket库(推荐)
如果你的项目本身是异步架构,直接用异步的WebSocket库(比如websockets)会更优雅,天然支持非阻塞操作,不用自己手动处理超时或监听套接字的逻辑。
import asyncio import websockets async def websocket_listener(): url = 'ws://example.com' async with websockets.connect(url) as ws: while True: # 用wait_for设置超时,实现非阻塞等待 try: data = await asyncio.wait_for(ws.recv(), timeout=1) print(f"收到异步WebSocket数据:{data}") except asyncio.TimeoutError: print("暂无异步消息,执行其他异步任务") # 这里可以添加你需要并行执行的异步操作 await asyncio.sleep(0.1) asyncio.run(websocket_listener())
另外要提一句:你设想的ws.not_empty()这种方法,在原生的websocket-client库中是不存在的,上面的几种方案都是实际可用的替代方式,根据你的项目复杂度和架构选择就好。
内容的提问来源于stack exchange,提问作者Greg
相关产品推荐
相关产品推荐

