我试图防止GRPC每个通道使用多个线程。为此,我使用以下代码设置了一个单线程执行程序:

for (int i = 0; i < 3 * numFaults + 1; i++) {
            //One thread for each channel
            ManagedChannel channel = NettyChannelBuilder
                    .forAddress(host, port + i + 1)
                    .usePlaintext()
                    .executor(Executors.newSingleThreadExecutor())
                    .build();


然后,我为每个通道创建一个asyn存根。

但是,这似乎不起作用,因为我仍然在程序中产生太多线程,最终耗尽了内存。

我应该将执行程序传递给存根吗?还是根本上有错?

提前致谢

最佳答案

产生的其他线程可能是EventLoop线程(默认情况下,它最多可以创建#个核心线程)。有一个选项可以在NettyChannelBuilder中提供EventLoopGroup。要使用此API,您还需要设置ChannelType。 EventLoopGroupChannel类型来自netty,如果您有兴趣,请参阅链接的javadoc以获取更多详细信息。

您可以在Linux上使用Epoll,否则使用NIO是当前的gRPC行为。下面的示例使用NIO。
所有网络事件都在事件循环线程上发生,因此使用更少的线程会极大地影响整体性能(取决于使用通道的方式)。您还可以考虑使用directExecutor并为EventLoopGroup分配更多线程。

NioEventLoopGroup sharedEventLoopGroup = new NioEventLoopGroup(numThread);
ManagedChannel channel = NettyChannelBuilder
    .forAddress(host, port + i + 1)
    .usePlaintext()
    .channelType(NioSocketChannel.class)
    .eventLoopGroup(sharedEventLoopGroup)
    .executor(Executors.newSingleThreadExecutor())
    .build();

08-18 16:58