我想编写一个基于 UDP 的应用程序,该应用程序需要重新传输未经远程主机确认的数据包。我认为有两种可能的方法:
-
对我的应用程序发送的每个数据包使用 reactor.callLater(( 来调用一个函数,该函数检查是否已收到确认(如果没有,则重新传输数据包(。
-
记住特殊列表中的每个数据包,并定期调用一个函数,该函数检查此列表的所有成员是否收到确认。此函数也将通过 reactor.callLater(( 调用 - 超时设置为下一次重新传输(列表中所有数据包的最短值(。
我的问题是:
- 第一种方法要简单得多 - 但是 Twisted 底层实现是否足够高效以使用它?
- 使用第二种方法时,是否可以中断 reactor.callLater((?例如,如果我安排了一个 20 秒的呼叫,突然我需要发送一个重新传输间隔为 5 秒的新数据包?
此致敬意
马西克
为了讨论callLater
的行为,我将忽略这个问题的UDP部分,并回答您提出的两个具体问题。 :)
处理延迟的呼叫非常高效。 安排单个新呼叫是已安排呼叫数的 O(log N(。 反应堆的整体性能在预定呼叫的数量上是恒定的。
就"中断"而言,"中断"对于你想要的东西来说是错误的词。 可以使用 reset
或 delay
重新安排延迟的呼叫。 而且,当然,您可以随时cancel
现有电话并安排新电话。