In general, gRPC-go provides a concurrency-friendly API. What follows are some guidelines.
A ClientConn can safely be accessed concurrently. Using
helloworld as an example, one could share the
multiple goroutines to create multiple
GreeterClient types. In this case, RPCs
would be sent in parallel.
When using streams, one must take care to avoid calling either
RecvMsg multiple times against the same Stream from different
goroutines. In other words, it's safe to have a goroutine calling
another goroutine calling
RecvMsg on the same stream at the same time. But it
is not safe to call
SendMsg on the same stream in different goroutines, or to
RecvMsg on the same stream in different goroutines.
Each RPC handler attached to a registered server will be invoked in its own goroutine. For example, SayHello will be invoked in its own goroutine. The same is true for service handlers for streaming RPCs, as seen in the route guide example here.