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

时间:2017-03-20 22:45:28

标签: 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;
}

它将搜索结果流回到指定的最大值。当通过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)
}

或者我需要继续致电Recv,直到我io.EOF确保gRPC正确清理其所有资源?

1 个答案:

答案 0 :(得分:0)

您的代码是正确的。

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