他の既知の/信頼できるノードからの受信データを同時に処理する小さな p2p アプリケーションを作成したいと思います (ほとんどの場合、SQLite データベースに格納されます)。これらのノードを認識するために、接続時に各ノードが自己紹介し、アプリケーションはこのノードを直接または別のノードを介して間接的に認識しているかどうかを確認する必要があります。したがって、明らかに処理時間が必要で、別のプロセス (または複数のワーカー プロセス) にアウトソーシングしたいグラフ検索を行う必要があります。以下の 2 番目の質問を参照してください)。また、場合によっては、グラフを調整したり、新しいエッジや頂点を追加したりする必要があります。
非同期 I/O 経由で着信接続を受け入れて処理する4 つのワーカー プロセスがあるとします。グラフにアクセス (読み取り/変更) するための最良の方法は何ですか? どうにかして検索結果を返す必要があるため、単一のキューでは明らかに読み取りアクセスのトリックは実行されません。
したがって、それを行う 1 つの方法は、グラフ検索プロセスによって満たされ、イベント ループに追加できる別のキューです。イベント ループは、結果をハンドラーに渡すことができます。ただし、このイベント/コールバックベースのアプローチでは、対応するソケットを常にコールバックに渡す必要があり、したがってキューにも渡す必要があります。これは、ソケットがピクル可能ではないため厄介です。(コールバックがスパゲッティ コードにつながるという事実は言うまでもありません。)
頭に浮かんだもう 1 つのアイデアは、着信接続ごとにグラフ プロセスへのパイプを作成し、グラフ側で非同期 I/O も行うことです。ただし、コールバックを回避するために、正しく理解していれば、非同期 I/O ライブラリを使用する必要がありますyield from
(つまり、 tulip / PEP 3156 )。他のオプションはありますか?
グラフ側の非同期 I/O について: これは確かに、多くの着信要求を一度に処理するための最良の方法ですが、グラフ ルックアップの実行は CPU を集中的に使用するタスクであるため、複数のワーカー スレッドまたはプロセスを使用することで利益が得られる可能性があります。問題は次のとおりです。複数のスレッドが共有データを許可しますが、Python の GIL はパフォーマンスの利点をいくらか無効にします。一方、複数のプロセスにはこの問題はありませんが、それらの間でデータを共有および同期するにはどうすればよいですか? (私にとって、グラフを分割することはまったく不可能に思えます。) この問題をうまく解決する方法はありますか? また、非同期 I/O とマルチスレッド / マルチプロセッシングを混在させることは、パフォーマンスの観点から意味がありますか?