gRPC服务器/客户端是否有用于连接的线程池的概念?可以重用线程,预分配线程,达到线程限制的队列请求等。
如果否,它是如何工作的,是否只是在需要时分配/销毁线程,而没有任何限制和/或重用?如果是,是否可以进行配置?
答案 0 :(得分:1)
这取决于您使用的是同步API还是异步API。
对于同步客户端,您的RPC调用会阻塞调用线程,因此它实际上并不相关。对于同步服务器,有一个内部线程池处理所有传入的请求,您可以在grpc::ResourceQuota
上使用ServerBuilder
来限制线程池使用的最大线程数。
对于异步客户端和服务器,gRPC使用CompletionQueue
作为用户定义自己的线程模型的一种方式。构建客户端和服务器的常用方法是使用用户提供的线程池在每个线程中运行CompletionQueue::Next
。然后,一旦它从Next
调用中获得了一些标记,就可以将其转换为用户定义的类型,并运行一些方法来进行状态转换。在这种情况下,用户可以完全控制正在使用的线程。
请注意,gRPC确实会创建一些内部线程,但是不应将它们用于大多数rpc工作。