我试图防止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。 EventLoopGroup和Channel类型来自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();