gpt4 book ai didi

python - 使用 Python Twisted 进行 UDP 流量控制

转载 作者:行者123 更新时间:2023-11-28 17:52:10 25 4
gpt4 key购买 nike

我有一个继承自 twisted.internet.protocol.DatagramProtocol 类的类。在我的 startProtocol() 实现中,我调用了 startWriting(),这样每次我可以无阻塞地写入时套接字都会收到通知。两个问题:

  1. 一旦套接字变为可写,twisted 将调用哪个方法?
  2. 如果需要在特定时间间隔调用它以将传出 UDP 带宽限制为特定数据报/秒数量,我应该如何调用 startWriting() 方法?

最佳答案

糟糕。我想我可能已经在另一个线程中回答了您的问题,并让您相信 Twisted 中的 UDP 流量控制支持比实际情况更强大。尽管如此,您还是可以完成需要做的事情...

1。一旦套接字变为可写,Twisted 将调用哪个方法?

不幸的是,Twisted 中的 UDP 协议(protocol)没有监控可写性,前提是 UDP 总是会失败,因此它永远不会引发 EWOULDBLOCK。 (实际上,它有时确实如此,而我在回答这个问题时刚刚重新发现了 this is a bug in Twisted。只有当 Twisted 以比本地线速更快的速度发送 UDP 时才会发生这种情况,这需要非常快的应用程序和非常慢的网络。 )

作为解决方法,您的应用程序可以简单地捕获 EWOULDBLOCK。对于任何其他协议(protocol),这种变通方法可能构成严重问题,但对于 UDP,您已经准备好丢失任何传出数据包,因此您无论如何都需要一个带内控制流机制。

帮助我们获得that bug通过review process也是一种选择。

如果你想变得真的花哨,你可以编写自己的替代 udp.Port (通过自己实现 IFileDescriptor)而不是编写 UDP 协议(protocol),并覆盖 doReaddoWrite(分别在底层套接字可读和可写时调用)。这将为您提供完美的写入级流量控制,但可能不是必需的,因为 UDP 有时会丢弃您的数据包,并且在无法正确处理“ICMP 源抑制”消息的网络上(愚蠢的防火墙配置为block ICMP 只会阻止),丢弃的数据包是您唯一的流量控制信息来源。我并不是说你不应该真正修复 Twisted 中的这个错误,但 UDP 世界中的这个现实可能是至今还没有人愿意这样做的原因。

2。如果需要在特定时间间隔调用 startWriting() 方法以将传出 UDP 带宽限制为特定数据报/秒数量,我应该如何调用它?

由于此答案第 1 部分中描述的限制,UDP 传输没有有用的 startWriting 方法。

但是,startWriting/stopWriting 无论如何都不是限制传出 UDP 带宽的正确方法。

在通过适当的调度机制调度所述调用后,在适当的时间简单地调用 self.transport.write(...)LoopingCall ,例如,旨在以适当的时间间隔调用 UDP 发送 RTP 媒体流,以传输声音样本。但是您也可以只计算自己的延迟并使用 callLater直接地。在任何情况下,如果您需要重新传输排队等待通过 UDP 传输的传出数据,您可能需要保留某种队列机制,所以只需 pop

如果您需要进行入站 流量控制,UDP 传输仍然很好地支持它,stopReadingstartReading .

希望这个回答对您有所帮助,如果我之前误导了您关于 Twisted 在这方面的功能,我深表歉意!

关于python - 使用 Python Twisted 进行 UDP 流量控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7906615/

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