grpc-java的ServerBuilder中executor的具体用途是什么?它只是执行处理程序方法吗?
What is the exact use of the executor in grpc-java’s ServerBuilder? Does it just execute the handler methods?
grpc-java 在其 ServerBuilder
中使用了一个执行器,如果 builder.executor()
方法没有定义,则默认使用静态缓存线程池。这个执行器的具体用途是什么?它只是执行处理程序方法还是还执行“其他操作”?
还有,grpc是怎么定义netty worker的EventLoopGroup
?具体来说,我想知道工作线程是如何分配给这个工作组的。线程数是否有默认值,或者它是机器核心数的函数?另外,关于上面的问题,这些 netty worker 如何与 executor 一起工作?他们只处理 I/O - 读写通道吗?
编辑:Netty,默认创建(2 * 核心数)个工作线程。
您提供的 Executor
是实际执行 rpc 回调的内容。这释放了 EventLoop
以继续处理连接上的数据。当一条新消息从网络到达时,它在事件循环中被读取,然后向上传播到堆栈到执行器。执行者获取消息并将它们传递给您的 ServerCall.Listener
,后者将实际处理数据。
默认情况下,gRPC 使用缓存线程池,因此非常容易上手。但是强烈建议您提供自己的执行器。原因是默认线程池在负载下表现不佳,在其余线程繁忙时创建新线程。
为了设置事件循环组,您在 NettyServerBuilder 上调用 workerEventLoopGroup 方法。 gRPC 并不严格依赖于 Netty(其他服务器传输也是可能的)因此必须使用 Netty 特定的构建器。
grpc-java 在其 ServerBuilder
中使用了一个执行器,如果 builder.executor()
方法没有定义,则默认使用静态缓存线程池。这个执行器的具体用途是什么?它只是执行处理程序方法还是还执行“其他操作”?
还有,grpc是怎么定义netty worker的EventLoopGroup
?具体来说,我想知道工作线程是如何分配给这个工作组的。线程数是否有默认值,或者它是机器核心数的函数?另外,关于上面的问题,这些 netty worker 如何与 executor 一起工作?他们只处理 I/O - 读写通道吗?
编辑:Netty,默认创建(2 * 核心数)个工作线程。
您提供的 Executor
是实际执行 rpc 回调的内容。这释放了 EventLoop
以继续处理连接上的数据。当一条新消息从网络到达时,它在事件循环中被读取,然后向上传播到堆栈到执行器。执行者获取消息并将它们传递给您的 ServerCall.Listener
,后者将实际处理数据。
默认情况下,gRPC 使用缓存线程池,因此非常容易上手。但是强烈建议您提供自己的执行器。原因是默认线程池在负载下表现不佳,在其余线程繁忙时创建新线程。
为了设置事件循环组,您在 NettyServerBuilder 上调用 workerEventLoopGroup 方法。 gRPC 并不严格依赖于 Netty(其他服务器传输也是可能的)因此必须使用 Netty 特定的构建器。