假设我定义了以下 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 正确清理其所有资源?
你的代码是正确的。
您可以在出现错误时退出。您无需等待 EOF。
编辑:上面的答案不完整。
调用者应该继续接收直到出现错误,否则可能会发生泄漏。还有其他方法可以避免泄漏,例如取消上下文。有关详细信息,请参阅https://pkg.go.dev/google.golang.org/grpc#ClientConn.NewStream。