0

毎分数千の接続を処理できる必要がある Python SSL サーバーを設計しています。クライアントが一定時間内にデータを送信しない場合、サーバーはリソースを解放するために接続を閉じる必要があります。

各接続の有効期限が切れているかどうかを確認する必要があるため、ソケットを非ブロックにし、ループ内のすべてのソケットのデータをチェックしながら、タイムアウトしたかどうかを同時にチェックする方が効率的ですか、それとも使用したほうがよいでしょうかselect() を使用して、データを持つソケットを取得し、接続タイムアウトを処理するためにソケットでデータが受信された時間によって順序付けられたある種の優先キューを維持しますか?

または、私が考えていなかったこれを行うためのより良い方法はありますか、または必要な機能を備えた使用できる既存のライブラリはありますか?

4

1 に答える 1

1

優先キューを使用して、誰が休眠しているかを追跡します。

ただし、特定の一定時間非アクティブな接続をタイムアウトするだけの場合は、本格的なプライオリティ キューは実際には必要ないことに注意してください。代わりにリンクされたリストを使用できます。

  • リンクされたリストには、すべてのソケットが最後にアクティビティが確認された順に格納されます。
  • ソケットがデータを受信すると、ソケットごとの「data last seen at」メンバーを更新し、そのリスト エントリをリストの後ろに移動します。
  • select()リストの先頭が期限切れになるまで時間を渡します。
  • ループの繰り返しの最後にselect()、期限切れのすべてのリスト ノードをポップオフし (それらは並べ替えられた順序になっています)、接続を閉じます。

適切なタイミングでソケットの有効期限が切れるようにする場合は、単調クロックを使用することが重要です。ある時点でクロックが逆行すると、リストのソート順が失われる可能性があります。

于 2013-06-14T03:10:20.103 に答える