gpt4 book ai didi

java - 多线程中的多个选择器

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:25:03 25 4
gpt4 key购买 nike

在 n 个线程之间分配传入连接是否有益,每个线程都有自己独立的 NIO Selector,其中 n 是服务器中的核心数?假设我正在编写一个服务器,它应该处理许多客户端连接。我可以有类似的东西:

selector.select();
Iterator<SelectionKey> i = selector.selectedKeys().iterator();

while (i.hasNext()) {
SelectionKey key = i.next();
i.remove();

if (!key.isValid())
continue;

if (key.isAcceptable()) {
// get one of the n selectors (I'd have one per core)
Selector chosenSelector = getRandomSelector();

// delegate the new connection to the chosen selector
SocketChannel newChannel = key.channel.accept();
newChannel.configureBlocking(false);
newChannel.register(chosenSelector, SelectionKey.OP_READ);
}
}

你们觉得这有道理吗?我的意思是,运行 n 个线程,每个线程都有不同的选择器?或者我应该坚持使用一个选择器线程来处理所有连接的 OP_READ?还是别的什么?

最佳答案

不,这没有好处,因为需要处理的代码与 IO 操作所花费的时间之间的关系可以忽略不计。特别是如果您考虑到同步零碎数据所需的额外时间。然而,在单独的线程中完成接收数据的处理是有益的。

所以基本上:有一个单线程选择器循环,将数据从一个缓冲区复制到任务缓冲区,以便在单独的线程中进一步处理,然后在执行器中启动一个带有该任务缓冲区的 Runnable 来处理复制的数据.

关于java - 多线程中的多个选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22147861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com