多个线程中的多个选择器

Edu*_*rra 9 java multithreading nio selector

在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);
   }
}
Run Code Online (Sandbox Code Playgroud)

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

Two*_*The 4

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

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

  • 因为这也让我有点困扰,所以我编写了一个测试程序来测量选择循环实际上在做什么,结果证实了我的建议。虽然在最大负载下,循环每秒处理大约 90k IO,但它仍然只能处理大约 1.5 个键/选择循环。所以线程化循环并没有多大好处。 (2认同)