sockets - 在 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,尽管我认为调用回调会浪费几分之一毫秒,而过程式单线程代码是最快的。
我还想避免函数调用开销,因此不能为我收到的每个数据报调用某种回调。
我应该选择哪个?
解决方案
这个问题并不能像所问的那样真正回答。
- 处理 UDP 数据报很可能不会成为此应用程序的限制因素。至少,您可能需要对这些数据进行身份验证或至少错误检查,这意味着您需要进行一些加密。
- 您需要在您关心的环境中实施某些东西并进行衡量。对于一个数据配置文件的一个版本的 linux 可能正确的答案在一个稍微不同的平台上可能是完全错误的,输入数据特征略有不同。您提到的所有方法在性能方面可能都很好,因此我将专注于允许您以合理的方式组织代码然后仅在不符合您的性能预算时才切换策略的方法。
为了在这里回答您更具体的问题,Twisted 本身基于多路复用器(我们试图避免select
它具有性能和可伸缩性问题,但是是的,select
它是可以使用的一种机制)。
推荐阅读
- java - 计算pdf文件java中每个单词的出现次数
- android - 单击片段中的edittext时如何弹出日期选择器
- javascript - 意外的空数组
- python - Python:每行数组的加权百分位数
- powershell - 在 Get-Mailbox cmdlet 的 GrantSendOnBehalfTo 属性中返回唯一用户 ID
- xml - XSLT:替换没有原始节点文本的元素/节点
- javascript - 你如何使用谷歌图表工具提示和 json 来提取元数据
- elasticsearch - es 关键字类型的最简单小写示例
- python - 如何将行的值转换为列
- c# - 在 Controller 操作返回后,如何强制立即释放 Scoped 服务?