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

如何实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:41:53