2012-01-04 2 views
3

nettyでは、チャネルパイプラインを流れるイベントは、各チャネルが効果的に1つのスレッドのみに割り当てられ、各ハンドラが順番に互いに呼び出します。これは理にかなっており、多くの同期化の問題を緩和します。Nettyのスレッドの使用の理解

IdleStateHandlerを使用すると、ソースの読み込みから、Timersスレッド(HashedWheelTimeが使用しているスレッドなど)のコンテキストでchannelIdleイベントが '処理される'ように見えます。

この場合、または私は何かを見逃しましたか?その場合、idlestateイベントとIOイベント(例:messageRecievedイベント)が同じチャネルで同時に実行される可能性がありますか?

また、ChannelHandler ctxを保存して別のスレッドで使用すると、たとえばチャネルに「書き込み」することができます。このため、同時に1つのスレッドの下流に、別のスレッドの上流にもイベントが発生します。同じチャンネル?

最後に、どのスレッドがChannelFuturesを実行するのですか?

これらの使用例はすべて完全に受け入れられ、Nettyの批判ではありません。私は実際にライブラリを非常に好んでおり、どこでもそれを利用しています。そのちょうど私がもっと複​​雑なことをやろうとすると、それがどのようにしてフードの下で働くのかを理解したいので、私は正しい量とちょうどいい量を使うようにすることができます。同期化(ロック)。

答えて

4

はいchannelIdleイベントとダウンストリーム/アップストリームイベントは同時に発生する可能性があります。ハンドラが3つのうちの少なくとも2つを実装している場合は、適切な同期を追加する必要があります。私は他の質問は、あなたがするので、その可能..あなたがあまりにもしたいすべてのスレッドからChannel.write(...)を呼び出すことができます

...今

..我々はjavadocをして、それをより明確にする必要がありますねあなたはいつでもどこにでもそれを保管し、いつでも書くことができます。これはまた、 "下流"ハンドラに対して適切な同期が必要な "制限"を与えます。

ChannelFuturesはワーカースレッド内から実行されます。

+0

ありがとう、私が知る必要があったことをありがとう。 – user1129382

1

あなたがIdleStateHandlerを使用する場合は、元の私の読書から、channelIdleイベントがタイマースレッド(HashedWheelTimeは、例えば使用しているスレッド)の文脈における「処理済み」されることが表示されます。

この場合、または私は何かを見逃しましたか?その場合、idlestateイベントとIOイベント(例:messageRecievedイベント)が同じチャネルで同時に実行される可能性がありますか?

はい、あなたはパイプラインでOrderedMemoryAwareThreadPoolExecutorでExecutionHandlerをhaveingされていない場合は、あなたが注文したイベント実行、IdleStateHandlerから特別にチャネル状態イベントを持つことができない、ネッティーで利用可能な注文イベント実行の概念を逃しました。また

、私はChannelHandlerのCTXを保存し、従ってまたイベントと同じで、別のスレッドで1つのスレッドで下流に行くと、上流を持って、例えばチャネルへの「書き込み」に別のスレッドでそれを使用することができますよう同じチャンネルの時間?

はい正しいです。

以上、OrderedMemoryAwareThreadPoolExecutorにダウンストリームの実行ハンドラimplがあります。

最後に、どのスレッドがChannelFuturesを実行するのですか?

ザ・は、OIO /仁王ワーカースレッドで実行されている

しかし、あなたのダウンストリーム・ハンドラは、イベントのいくつかのタイプを消費し、下流下記にイベントの別のタイプを発射した場合、その後、あなたのダウンストリームハンドラは、必要に応じて処理することができます

将来の実行。これは、将来のフォームのダウンストリームイベントとコールを取得することによって行うことができます。

future.setSuccess() 
+0

お寄せいただきありがとうございます:) – user1129382

関連する問題