8

私は現在、演習として単純な P2P ネットワークを開発しています。ネットワーク内の各ノードは、他のノードのサブセットにハートビートを送信して、ネットワークを離れたノードを検出できるようにします。ハートビート パケットのほかに、新しいノードがネットワークに参加/離脱するとき、リソース (小さなテキスト ファイル) を見つけたいときなどにパケットを送信します。すべてのパケットは UDP パケットです。

パケットを受信するたびに、その特定のパケットを処理する新しいスレッドを開始します。ただし、1 つのアプリケーションの有効期間中に開始するスレッドの量が非常に多くなることに関心があります (特にハートビートのため)。(デッドロックなどのリスクもあり、避けたいところです)。

すべての着信パケットを配置し、そのキューからすべてのパケットを一度に 1 つずつ処理する単一のスレッド (生産者と消費者のパターンのようなもの) を持つキューまたは何かを用意することを考えました。送信者がパケットが失われたと思わないように、パケットを迅速に処理したいと考えています。

パケットごとに新しいスレッドを開始することなく、多数の異なる着信パケットを処理する最良の方法は何ですか? 私が持っているもの、プロデューサーを消費するもの、または別のものを使用する必要がありますか?

4

2 に答える 2

0

アプリケーションが 1 つのパケットを処理するのにかかる時間は?

ping の場合は、受信したときに処理する方がおそらく高速です。他のものは、特定のブロッキング キューなどの共有データ構造に入れることができます。そのため、キューが空の場合、ワーカー スレッドは新しいジョブを待ちます。新しいジョブが追加され、スレッドが起動され、ジョブを実行します。

おそらく、パケットごとに 1 つのスレッドを開始すると、実際にジョブを実行するよりも、スレッドの開始と停止により多くの時間を費やすことになります。

すべてのタイプのパケットで、パケットに応答して実行する処理にそれほど時間がかからない場合は、キューのロックとスレッドのスケジューリングに費やされる余分な時間が、プログラムを高速ではなく遅くしている可能性があります。

いずれにせよ、スレッド プールを使用し、最初にワーカーを起動します。必要に応じて、過去数分間の負荷に応じて、作業スレッドの数を動的に増減できます。

于 2012-11-29T22:15:49.797 に答える
0

を使用しevent driven architectureます。パケットごとに新しいスレッドを作成することはスケーラブルではないため、これは一定量のワークロードに対しては機能しますが、もう機能しない点があります。たとえば、メッセージがパケットである Facebook チャットのようなチャット プログラムと比較することができます。イベント駆動型のアーキテクチャはスケーラブルであり、IMHO はまさにあなたが探しているものです。グーグルで調べてみてください。多くのプログラミング言語用のライブラリがありますので、自分に合ったものを選んでください (私は Erlang、Scala、C、または Python でそれを行うのが好きです)。

編集: OK、Java タグが表示されませんでした。しかし、言語は問題ではありません。

たとえば、このリンクを見てください: http://www.nightmare.com/medusa/async_sockets.html

イベント駆動型プログラミングのアイデアを得るには、非常に良いものだと思います。

于 2012-11-29T22:48:06.730 に答える