gpt4 book ai didi

python - 在 Python 中使用 socket.send() 的 UDP 调用非常慢

转载 作者:太空狗 更新时间:2023-10-29 12:14:48 24 4
gpt4 key购买 nike

我正在尝试在 Linux 环境中编写一个简单的 Python 脚本来测试必须处理包含小负载(12 字节)的高频 UDP 消息的以太网交换机。

基本设计是我有一台笔记本电脑(带 Ubuntu VirtualBox)运行 python 脚本,使用 socket.recvfrom() 连接到 100Mbps 交换机 (Netgear FS105)。此交换机连接到桌面 PC(带有另一个 Ubuntu VirtualBox),它发送包含两个字节的 UDP 数据包。这些字节只是一个计数器,它允许我查看数据包在传输后是否被重新排序或丢失。

传输代码如下所示:

    self.sock = socket.socket(socket.AF_INET,
socket.SOCK_DGRAM) # UDP

period_s = 1 / 5000.0 # 5KHz
while True:
udp_count = chr ((i >> 8) & 0xFF) + chr( i & 0xFF )
start_time_s = time.time()
self.sock.sendto(udp_count, (self.UDP_BROADCAST_IP, self.UDP_PORT))
remaining_idle_time_s = period_s - start_time_s
time.sleep(remaining_idle_time_s)
i += 1

每隔几秒,remaining_idle_time_s 就会返回负数,因为 self.sock.sendto() 函数花费的时间超过 0.2 毫秒。

使用 cProfile,我可以看到平均 self.sock.sendto() 调用需要 0.14 毫秒,但有时需要长达 3 毫秒!使用 getsockopt() 我可以看到套接字发送缓冲区非常大 (212992)。

我该怎么做才能使 sock.sendto() 返回得更快。我猜测需要 3 毫秒的实例是由于 CPU 决定执行另一项任务。有没有办法防止我的程序发生这种上下文切换?

最佳答案

您想在非实时操作系统(Linux 不是实时操作系统)中执行实时任务。

Realtime并不意味着快速,而是在指定的时间限制内完成任务:即防止上下文切换是一种方法,因为您的任务时间变得可预测。

使用 C 或编写内核驱动程序来实现它可以使其更快,但不是确定性的。有一些硬实时 Linux 实现,如 RTLinux但如果您的主机不是实时的,则在虚拟机中运行它没有任何意义。

在 Linux 中没有办法做到这一点,我对此感到非常高兴,因为防止上下文切换的可能性意味着每个应用程序都可以阻止操作系统执行其所谓的重要工作....

关于python - 在 Python 中使用 socket.send() 的 UDP 调用非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29528498/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com