1

リモートホストによって確認されていないパケットを再送信する必要があるUDPベースのアプリを作成したいと思います。私は2つの可能なアプローチがあると思います:

  1. アプリケーションから送信されるすべてのパケットに対してreactor.callLater()を使用して、確認が受信されたかどうかを確認する関数を呼び出します(受信されていない場合はパケットを再送信します)。

  2. 特別なリスト内のすべてのパケットを覚えて、確認が受信されたかどうかこのリストのすべてのメンバーをチェックする関数を定期的に呼び出します。この関数は、reactor.callLater()を介して呼び出されます。タイムアウトは次の再送信(リスト内のすべてのパケットの最短値)に設定されます。

私の質問は次のとおりです。

  1. 最初のアプローチははるかに単純ですが、Twistedの基盤となる実装はそれを使用するのに十分効率的ですか?
  2. 2番目のアプローチを使用する場合、reactor.callLater()を中断することは可能ですか?たとえば、通話が20秒間スケジュールされていて、突然5秒の再送信間隔で新しいパケットを送信する必要がある場合はどうでしょうか。

よろしくお願いします

マシエック

4

1 に答える 1

1

の動作について説明するためにcallLater、この質問の UDP 部分は無視して、あなたが尋ねた 2 つの具体的な質問に答えます。:)

遅れた電話の処理は効率的です。1 つの新しい通話をスケジュールすることは、既にスケジュールされている通話の数に対して O(log N) です。全体的な原子炉のパフォーマンスは、スケジュールされた呼び出しの数で一定です。

「中断」に関する限り、「中断」はあなたが望むものに対して間違った言葉です。 遅延した通話はreset、またはを使用して再スケジュールできますdelay。そしてもちろん、いつでもcancel既存の通話と新しい通話のスケジュールを設定できます。

于 2012-05-17T14:58:42.547 に答える