4

我可以创建 1 个 Netty NioWorkerPool 实例并在多个 ServerBootstrap 和 ClientBootstrap 实例之间共享它吗?我的应用程序有很多空闲线程,目前,每个 Bootstrap 都在创建自己的 NioWorkerPool 以用于我机器上 2* 的内核数。

如果我共享这个池子,会有什么后果?每个人最终都有机会运行,还是服务器或客户端连接会尝试占用所有内容?

即使拥有一个用于服务器和一个用于客户端的 NioWorkerPool 也比我拥有的要好。

据我所知,这不是一个重复的问题。我看到其他人谈论共享 Executor,我已经这样做了,我对共享实际的 NioWorkerPool 实例更感兴趣。我有我的进程的线程转储,我有大约 3000 个线程,其中大部分正在等待 Netty NIO 事件。

4

1 回答 1

4

是的你可以。这是一个例子:

ExecutorService executor = Executors.newCachedThreadPool();
NioClientBossPool clientBossPool = new NioClientBossPool(executor, clientBossCount);
NioServerBossPool serverBossPool = new NioServerBossPool(executor, serverBossCount);
NioWorkerPool workerPool = new NioWorkerPool(executor, workerCount);

ChannelFactory cscf = new NioClientSocketChannelFactory(clientBossPool, workerPool);
ChannelFactory sscf = new NioServerSocketChannelFactory(serverBossPool, workerPool);
...

ClientBootstrap cb = new ClientBootstrap(cscf);
ServerBootstrap sb = new ServerBootstrap(sscf);

请注意,您不应ChannelFactory为您创建的每个引导实例创建一个新实例。你应该重用工厂。

在不同的连接之间共享工作池意味着客户端套接字和服务器套接字接受的套接字可以由属于工作池的同一 I/O 线程处理。假设这些通道的处理程序在被 I/O 线程调用时不会花费太多时间,这通常是一个好主意。

但是,如果某种类型的通道的处理程序比其他通道的处理程序花费更多的时间,您可能会观察到那些没有尽快轮到他们的通道的延迟响应。可以通过确保所有处理程序不阻塞并尽快完成其工作并快速返回来解决此问题。

于 2013-04-04T07:46:10.423 回答