Python 为什么套接字连接会缓冲这么多数据?

Python 为什么套接字连接会缓冲这么多数据?,python,sockets,udp,buffering,python-sockets,Python,Sockets,Udp,Buffering,Python Sockets,我有一个程序以10Hz的频率发送数据 import socket import time if __name__ == '__main__': sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.bind(('127.0.0.1', 19080)) while True: data = time.time() sock.sendto(str(data).encode

我有一个程序以10Hz的频率发送数据

import socket
import time


if __name__ == '__main__':
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.bind(('127.0.0.1', 19080))

    while True:
        data = time.time()
        sock.sendto(str(data).encode(), ('127.0.0.1', 9090))
        time.sleep(0.1)
以及接收数据的第二程序,具有延迟(1Hz):

一段时间后,输出为:

1600859111.7595737 b'1600858988.4863389'
1600859112.760249 b'1600858988.5863452'
1600859113.760647 b'1600858988.6864707'
1600859114.761207 b'1600858988.7871313'
1600859115.761991 b'1600858988.8875835'
在接收数据(右)和发送数据(左)的时间上,您可以看到很大的差异。
为什么它有这么多的数据缓冲,我如何才能摆脱这个?我想要可能的最新帧,而不是缓冲帧。

我找到了anserw。我必须为输入缓冲区的大小设置套接字选项

   sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 0)

将其设置为
0
,以获得最大效率。

将插座设置为非阻塞模式:

sock.setblocking(False)
然后,反复调用
sock.recv
,直到您得到:


这样做的好处是可以读取缓冲区中的所有消息。这也意味着您可以在缓冲区中看到最新消息。您的解决方案会导致操作系统丢弃较新的消息,直到您收到最旧的消息。

谢谢您的回答,但是
time.sleep()
在我的代码中,模拟计算需要一些时间,我不需要来自套接字的过时数据,我只需要最新的数据,因此从缓冲区接收所有数据对我来说毫无意义。很抱歉,我没有在主帖子中清楚地标注尺寸。@rozumir接收所有数据是有意义的,这样您就可以得到最新的数据。否则,您将得到最旧的,因为操作系统会忽略较新的,因为它们不适合缓冲区。
sock.setblocking(False)
while True:
    try:
        msg = sock.recv(100)
        print(time.time(), msg)
    except socket.error as e:
        if e.args[0] not in (errno.EAGAIN, errno.EWOULDBLOCK):
            raise
        break
# we get to this point when there's nothing else to receive.
# Maybe you sleep here, or set it to blocking mode and receive again, or something.