【发布时间】:2019-02-17 07:25:44
【问题描述】:
gRPC 服务器/客户端是否有任何用于连接的线程池概念?可以重用线程、预分配线程、达到线程限制的队列请求等。
如果不是,它是如何工作的,它只是在需要时分配/销毁线程,没有任何限制和/或重用?如果可以,是否可以配置?
【问题讨论】:
gRPC 服务器/客户端是否有任何用于连接的线程池概念?可以重用线程、预分配线程、达到线程限制的队列请求等。
如果不是,它是如何工作的,它只是在需要时分配/销毁线程,没有任何限制和/或重用?如果可以,是否可以配置?
【问题讨论】:
这取决于您使用的是同步 API 还是异步 API。
对于同步客户端,您的 RPC 调用会阻塞调用线程,因此它并不真正相关。对于同步服务器,有一个内部线程池处理所有传入请求,您可以在ServerBuilder 上使用grpc::ResourceQuota 来限制线程池使用的最大线程数。
对于异步客户端和服务器,gRPC 使用CompletionQueue 作为用户定义自己的线程模型的一种方式。构建客户端和服务器的一种常见方法是使用用户提供的线程池在每个线程中运行CompletionQueue::Next。然后,一旦它从Next 调用中获得一些标签,您就可以将其转换为用户定义的类型并运行一些方法来继续该状态。在这种情况下,用户可以完全控制正在使用的线程。
注意 gRPC 确实会创建一些内部线程,但它们不应该用于大多数 rpc 工作。
【讨论】:
ResourceQuota,我认为它只是内存配置?我发现的唯一东西是GRPC_ARG_MAX_CONCURRENT_STREAMS,它限制了 HTTP2 流数。
ResourceQuota::SetMaxThreads