2016-09-21 7 views
0

私はgRPCを使う必要がありますが、シングルスレッドのアプリケーションでは(追加のソケットチャンネルを使って)。純粋に、私はselect()を使うことを考えています。そして、どのファイル記述子がポップするかによって、gRPCを呼び出してメッセージを処理します。私の質問は、私がselect()ポップの後に呼び出す必要があるものについて、誰かが私に粗い(コードの5-10行)概要スケルトンを与えることができるということですか?select()とgRPCを使ってサーバーを作成するにはどうすればいいですか?

同期ケースの例を見ると、スレッドプール(これは使用できません)を意味し、非同期のケースではメインループがブロックされていることを示しています。他のソケット操作を処理する必要があります。

+0

'select()'の使用に関するチュートリアルでは、その基本的な使い方を示す必要があります。 – Barmar

+0

実際には、select()は問題ではありません(私はそれを使用する方法を知っています)。問題は、gRPCで呼び出されたファイルディスクリプタを "処理"してgRPCが待機をブロックしないことを保証するより多くのデータ。 – rkrten

+0

可能でない可能性があります。多くのRPCライブラリが提供する高度なアプローチでは、I/Oと関数呼び出しの手順を分けることができない場合があります。 – Barmar

答えて

0

あなたはこの時点で(そしておそらくこれまで)これを行うことはできません。

select()/ poll()スタイルのAPIを直接使用するなど、イベントループの大きな弱点の1つは、それらの2つの間の直接的な統合には自然な形では構成できないことです。

理論的にはLinux用にこの機能を追加することができます - epoll_fdをtimerfdで書き出します。これは完了キューに呼び出すのが生産的であれば読み込み可能になりますが、残りの部分にはかなりの制約とアーキテクチャ上のオーバーヘッドがあります。このユースケースをLinux上でのみサポートするためにスタックしてください。どこにいても、そのfdの可読性を管理するバックグラウンドスレッドが必要です。

関連する問題