【问题标题】:Python sockets: received frames queue managementPython套接字:接收帧队列管理
【发布时间】:2021-10-01 09:42:36
【问题描述】:

我正在为飞行模拟器创建仪表板。 sim 通过 UDP 发送数据,面板解析这些数据并使用它来转换和渲染 SVG。该面板在 Linux 上运行。

sim 发送 UDP 帧的速度超过了面板的渲染速度,因此帧排队,面板最终落后于 sim 几秒钟。除了the MSG_PEEK flag,我还没有找到任何关于如何配置或管理此队列的建议,这与我想要的完全相反。

每个 UDP 帧都包含完整的键/值对集,因此理想情况下,我会在收到新帧时丢弃队列中的所有旧帧。

我该怎么做:

  • 读取下一帧并丢弃队列中的任何后续帧
  • 读取最近的帧并丢弃其余帧
  • 将队列大小设置为 1 或较小的数字

我确信有一个简单的方法可以做到这一点,但一个小时左右的搜索和实验还没有找到解决方案。

这是当前面板代码的表示:

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(("",54321))
sock.settimeout(0.5)

while True:
    try:
        frame = sock.recv(1024)
        parse_and_render(frame)
    except socket.timeout:
        pass

【问题讨论】:

    标签: python python-3.x sockets udp python-sockets


    【解决方案1】:

    这很难看,但有效:

    import socket
    
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.bind(("",54321))
    sock.setblocking(False)
    
    frame = bytearray(b" " * 1024)
    extra_frame = bytearray(b" " * 1024)
    
    while True:
        try:
            # load next available frame
            sock.recv_into(frame, 1024) != -1
            
            # if there's any more frames available, overwrite with that
            try:
                while sock.recv_into(extra_frame, 1024) != -1:
                    frame = extra_frame
            except BlockingIOError:
                pass
    
            # render the most recent frame
            parse_and_render(frame)
    
        except BlockingIOError:
            pass
    

    【讨论】:

      猜你喜欢
      • 2018-12-27
      • 1970-01-01
      • 1970-01-01
      • 2016-01-27
      • 1970-01-01
      • 2013-05-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      相关资源
      最近更新 更多