我已经在golang中创建了一个示例gRPC客户端和服务器(使用了protobufs)。 我了解golang中的并发模型。 但是,我试图理解服务器中的并发模型,该服务器接受来自同一客户端(客户端上的多个goroutine)/多个客户端的并行请求。

进一步来说:

  • 当出现新的gRPC调用时,服务器是否创建新的goroutine?
  • 这些goroutine共享哪些数据? grpcServer.Serve是否设置跨goroutines共享的数据的边界,即共享之前设置的所有内容? (我正在考虑Java中的线程共享全局数据的线程)
  • When a new gRPC call comes, does server create a new goroutine?

    是的,并且很可能会创建许多并发的goroutine来处理每个连接和请求(尤其是流请求)。

    What data is shared by these goroutines?

    我认为这个问题太笼统了。 net/http2google.golang.org/grpc软件包中都有太多代码,无法在不进行深入调查的情况下回答您的问题。 但是,我们可以确定,这些goroutine至少共享服务器本身,因为ServeConn不是自由函数,而是在http2.Server类型上定义的方法。