首页 > 解决方案 > 在 Python 中对 UDP 数据报做出反应的最快方法是什么?

问题描述

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

标签: socketscallbackudptwistedlatency

解决方案


这个问题并不能像所问的那样真正回答。

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

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


推荐阅读