Netty 为什么通过本地通道连接的客户端需要EventLoopGroup?

Netty 为什么通过本地通道连接的客户端需要EventLoopGroup?,netty,Netty,这实际上可能适用于一般的客户机,使用引导-显然,任何客户机都需要该组 但是,如果在一个JVM上运行多个客户机,那么为每个客户机创建一个EventLoopGroup会消耗大量内存,并且可以很容易地为自己创建一个EventLoopGroup 我可以通过在JVM中的所有客户端之间共享一个全局EventLoopGroup来解决这个问题,并使用引用计数来确保其干净地初始化和销毁,但这看起来更像是一个解决方案,而不是预期的设计 而且似乎没有任何EventLoopGroup实现只使用一个单线程执行器,可以串行

这实际上可能适用于一般的客户机,使用引导-显然,任何客户机都需要该组

但是,如果在一个JVM上运行多个客户机,那么为每个客户机创建一个EventLoopGroup会消耗大量内存,并且可以很容易地为自己创建一个EventLoopGroup

我可以通过在JVM中的所有客户端之间共享一个全局EventLoopGroup来解决这个问题,并使用引用计数来确保其干净地初始化和销毁,但这看起来更像是一个解决方案,而不是预期的设计

而且似乎没有任何EventLoopGroup实现只使用一个单线程执行器,可以串行执行客户端的调用;我意识到这与Netty的异步特性有些不一致,但这是一个合法的用例。

EventLoopGroup旨在在多个客户端通道之间共享。您不需要为创建的每个频道创建新的EventLoopGroup

我不知道为什么您必须在EventLoopGroup的生命周期中引入引用计数,但您可以在应用程序即将自行终止时将其关闭。或者,您可以指定一个创建守护进程线程的线程工厂,然后JVM将在不等待EventLoopGroup创建的线程的情况下终止。Netty实际上提供了DefaultThreadFactory,它便于创建守护进程线程

要使EventLoopGroup成为单线程,只需指定1作为构造函数参数。

EventLoopGroup旨在在多个客户端通道之间共享。您不需要为创建的每个频道创建新的EventLoopGroup

我不知道为什么您必须在EventLoopGroup的生命周期中引入引用计数,但您可以在应用程序即将自行终止时将其关闭。或者,您可以指定一个创建守护进程线程的线程工厂,然后JVM将在不等待EventLoopGroup创建的线程的情况下终止。Netty实际上提供了DefaultThreadFactory,它便于创建守护进程线程


要使EventLoopGroup成为单线程,只需将1指定为构造函数参数。

我使用引用计数方法,因为最初每个客户端都创建自己的EventLoopGroup,而负载测试会产生许多客户端以命中远程服务器,消耗大量内存,即使是单线程时也是如此。我本可以向客户机中注入一个全局事件组,并让它以这种方式重新使用,但ref计数是一种更简单的方法。对于您的用例,有没有关于网络方面的改进建议?如果组是可选的,那就好了。至少对我来说,客户端的线程池太重了,我只需要在负载测试时找到一种解决方法。或者,如果有一种简单的方法来指定某种类型的callerRuns组,类似于ThreadPoolExecutor.CallerRunPolicy,那么它就可以正常工作。客户机已经在他们自己的线程中。最后,如果有一种简单的方法可以创建一个组来包装现有的ExecutorService,那么我可以单独管理它,这会很有用,假设与我现在所做的类似,我使用引用计数方法,因为最初每个客户机都创建自己的EventLoopGroup,负载测试导致许多客户端访问远程服务器,消耗了大量内存,即使是单线程的。我本可以向客户机中注入一个全局事件组,并让它以这种方式重新使用,但ref计数是一种更简单的方法。对于您的用例,有没有关于网络方面的改进建议?如果组是可选的,那就好了。至少对我来说,客户端的线程池太重了,我只需要在负载测试时找到一种解决方法。或者,如果有一种简单的方法来指定某种类型的callerRuns组,类似于ThreadPoolExecutor.CallerRunPolicy,那么它就可以正常工作。客户机已经在他们自己的线程中。最后,如果有一种简单的方法来创建一个组来包装现有的ExecutorService,那么我可以单独管理它,这将是非常有用的,因为这与我现在所做的类似