【问题标题】:What is the fastest way to react to UDP datagrams in Python?在 Python 中对 UDP 数据报做出反应的最快方法是什么?
【发布时间】:2021-09-26 09:38:10
【问题描述】:

我正在编写一个特定的应用程序,该应用程序必须根据通过 UDP 协议传输的数据在屏幕上呈现图像,并尽可能降低延迟。整体程序设计无关紧要,代码清洁度或可维护性也无关紧要。我需要 1 毫秒的延迟(用于处理数据报并调用翻转视频缓冲区的回调)或低于该延迟。
现在,我正在考虑以下方法:socket.socket().recvfrom()selectors.DefaultSelector().register()asyncore.dispatchermultiprocessing.Processconcurrent.futures.ProcessPoolExecutor().submit()twisted.internet.protocol.ConnectedDatagramProtocol
虽然socket.recvfrom() 是最简单的方法,但它意味着下面的while true 循环是阻塞的,并且如果在调用recvfrom() 方法之前发送数据报,则不允许侦听 (即没有缓冲区),我的应用程序将以 1500 Hz 的频率接收数据报。
twisted 框架是否足够快?是基于select还是基于回调?
我个人的偏好是我使用 ProcessPoolExecutor,尽管我认为必须调用回调会浪费几分之一毫秒,而过程式单线程代码是最快的。
我还想避免函数调用开销,因此不能为我收到的每个数据报调用某种回调。
我应该选择哪个?

【问题讨论】:

  • 您认为刷新显示的速度有多快?每秒60次?每秒120次?您认为观看显示器的人可以多快看到它的更新?对网络的响应比您实际更新显示的速度更快有什么好处?
  • @Jean-PaulCalderone,当一个特别重要的数据到达时,我只需要更新一次 - 但是当它更新时,我需要快速完成;将有一个 240 赫兹的显示屏,可能带有 G-sync

标签: sockets callback udp twisted latency


【解决方案1】:

这个问题并不能真正回答。

  1. 很可能,处理 UDP 数据报不会成为此应用程序的限制因素。至少,您可能需要对这些数据进行身份验证或至少错误检查,这意味着您需要进行一些加密。
  2. 您需要在您关心的环境中实施和衡量。对于一个数据配置文件的一个版本的 linux 可能正确的答案在一个稍微不同的平台上可能是完全错误的,输入数据特征略有不同。您提到的所有方法在性能方面可能都很好,所以我会专注于一些可以让您以合理的方式组织代码然后仅在不符合您的性能预算时才切换策略的方法。

为了在这里回答您更具体的问题,Twisted 本身基于多路复用器(我们尽量避免 select 存在性能和可扩展性问题,但是是的,select 是它可以使用的一种机制)。

【讨论】:

  • 数据有效性在这里不是问题,也不需要加密 - 数据馈送来自本地网络,通过“稀薄空气”与所有公共网络分开
猜你喜欢
  • 2019-06-18
  • 1970-01-01
  • 1970-01-01
  • 2021-08-28
  • 1970-01-01
  • 2021-04-12
  • 2022-10-20
  • 1970-01-01
  • 2016-02-12
相关资源
最近更新 更多