0

ええと、これは netty nioWorker Netty アーキテクチャに関する質問です - NioWorker ループに関する質問

しかし、私は別の焦点を持っています、私はそれを見つけました

processRegisterTaskQueue();
processEventQueue();
processWriteTaskQueue();

この 3 つのキューには Runnable 型が含まれていますが、run() メソッドを呼び出します

private void processWriteTaskQueue() throws IOException {
        for (;;) {
        final Runnable task = writeTaskQueue.poll();
        if (task == null) {
            break;
        }

        task.run();
        cleanUpCancelledKeys();
    }
}

これはハンドル キューが同期されていることを意味します。ハンドラー キューが長すぎる可能性があり、processSelectedKeys を時間内に実行できませんか?</p>

ちなみに、私がデータを書き込むとき、nettyはデータをwriteBufferQueueにプッシュし、書き込みタスクをwriteTaskQueueにプッシュし、次にprocessWriteTaskQueueを実行するときにタスクを処理します

 if (channel.writeTaskInTaskQueue.compareAndSet(false, true)) {
            // "add" the channels writeTask to the writeTaskQueue.
            boolean offered = writeTaskQueue.offer(channel.writeTask);
            assert offered;
 }

processWriteBufferQueue() など、Niowork ループで直接データを処理しないのはなぜですか?

誰か説明できますか?ありがとう

4

1 に答える 1

0

この投稿には 2 つの質問があります。

最初の質問は、ハンドラーのキューが長すぎて間に合わない可能性はありますprocess SelectKeys()か?

はい。ただし、ハンドラーの実装が意図的に乱用しない限り、発生しないようです。

2 番目の質問は、書き込み操作が常に I/O ループ スレッドで実行されるのはなぜですか?

そうしないと、1) 異なるスレッドから書き込みを行うと、ライター スレッド間で多くの競合が発生し、2) 競合状態 (接続のリセットなど) が原因でさまざまなソケット例外が発生し、3) Netty 内部がより複雑になります。そのような条件に対処します。

Netty 4 では、スレッド モデルがより厳密になり、イベント ループの実装がより単純になったことに注意してください。そのため、そちらも参照してください。

于 2012-06-15T01:51:56.033 に答える