与 grpc.ClientStreams 交互时,是否需要调用 Recv 直到获得 io.EOF?

rni*_*ckb 5 go grpc

假设我定义了以下 gRPC 服务:

service Library {
  rpc Search(SearchBookRequest) returns (stream SearchBookResponse) {} 
}

message SearchBookRequest {
  string term = 1;
  int32 max_results = 2;
}

message SearchBookResponse {
  int32 book_id = 1;
}
Run Code Online (Sandbox Code Playgroud)

它将搜索结果流式传输回指定的最大值。当通过 gRPC 的 Go API 与服务交互时,我可以做这样的事情吗?

for i:=0; i<maxResults; i++ {
  search_result, err := stream.Recv()
  if err == io.EOF {
    // Note: If `maxResults` are returned this will never be reached.
    break
  }
  if err != nil {
    log.Fatalf("search error: %v", err)
  }
  fmt.Printf("Book-ID: %d\n", search_result.BookId)
}
Run Code Online (Sandbox Code Playgroud)

或者我是否需要继续调用,Recv直到确保io.EOFgRPC 正确清理其所有资源?

men*_*anl 1

你的代码是正确的。

您可以在出现错误时退出。您无需等待 EOF。


编辑:上面的答案不完整。

调用者应该继续接收直到出现错误,否则可能会发生泄漏。还有其他方法可以避免泄漏,例如取消上下文。有关详细信息,请参阅https://pkg.go.dev/google.golang.org/grpc#ClientConn.NewStream