1

我想编写一个基于 UDP 的应用程序,它需要重新传输未经远程主机确认的数据包。我假设有两种可能的方法:

  1. 对我的应用程序发送的每个数据包使用 reactor.callLater() 来调用一个检查是否已收到确认的函数(如果没有收到则重新传输数据包)。

  2. 记住一个特殊列表中的每个数据包,并定期调用一个函数来检查该列表中的所有成员是否已收到确认。这个函数也可以通过 reactor.callLater() 调用——超时设置为下一次重传(列表中所有数据包的最短值)。

我的问题是:

  1. 第一种方法要简单得多——但是 Twisted 底层实现是否足够高效以使用它?
  2. 使用第二种方法时,是否可以中断 reactor.callLater()?例如,如果我安排了一个 20 秒的通话,突然我需要发送一个重传间隔为 5 秒的新数据包?

最好的祝福

马切克

4

1 回答 1

1

为了讨论 的行为callLater,我将忽略此问题的 UDP 部分并回答您提出的两个具体问题。:)

处理延迟呼叫是有效的。安排一个新的呼叫是 O(log N) 对已经安排的呼叫的数量。总体反应器性能在预定呼叫次数上是恒定的。

就“打断”而言,“打断”对于你想要的东西来说是错误的词。 可以使用reset或重新安排延迟的呼叫delay。而且,当然,您可以随时cancel拨打现有电话并安排新电话。

于 2012-05-17T14:58:42.547 回答