gpt4 book ai didi

python - Go 中的 gRPC 服务器与 Python 中的客户端之间的兼容性

转载 作者:IT王子 更新时间:2023-10-29 01:38:10 24 4
gpt4 key购买 nike

我想知道 Go 中的 gRPC 服务和 Python 中的客户端的兼容性。

例如if the service is implemented in Go , 它会有这样的签名:

...

func (s *routeGuideServer) GetFeature(ctx context.Context, point *pb.Point) (*pb.Feature, error) {
...
}
...

func (s *routeGuideServer) ListFeatures(rect *pb.Rectangle, stream pb.RouteGuide_ListFeaturesServer) error {
...
}
...

func (s *routeGuideServer) RecordRoute(stream pb.RouteGuide_RecordRouteServer) error {
...
}
...

func (s *routeGuideServer) RouteChat(stream pb.RouteGuide_RouteChatServer) error {
...
}

注意 error 对象是如何返回的。

现在,如果我必须 implement the client in Python it will be something like this :

feature = stub.GetFeature(point)
for received_route_note in stub.RouteChat(sent_route_note_iterator):

Go 服务实现返回的 error 字段会发生什么变化?如果服务器端出现错误,如何在 Python 客户端中处理?

最佳答案

gRPC 提供适合所用语言的错误处理。

如您所述,在 Go server 中你返回一个错误:

func (s *routeGuideServer) RouteChat(stream pb.RouteGuide_RouteChatServer) error {
for {
in, err := stream.Recv()
if err == io.EOF {
return nil
}
if err != nil {
return err
}
...

在 Python 客户端中,您在 try 语句中执行 API 调用(人为的示例,因为官方文档没有对此进行演示):

while True:
try:
received_route_note = stub.RouteChat(sent_route_note_iterator)
except grpc.Error as e:
print(e.details())
break

相反,在 Python 服务器中,您设置上下文并选择性地引发异常:

  • 示例来自 Python Generated Code Reference :

    def TellFortune(self, request, context):
    """Returns the horoscope and zodiac sign for the given month and day.
    errors: invalid month or day, fortune unavailable
    """
    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
    context.set_details('Method not implemented!')
    raise NotImplementedError('Method not implemented!')
  • 示例来自 grpc repository

    def UnUn(self, request, context):
    if _application_common.UNARY_UNARY_REQUEST == request:
    return _application_common.UNARY_UNARY_RESPONSE
    else:
    context.set_code(grpc.StatusCode.INVALID_ARGUMENT)
    context.set_details('Something is wrong with your request!')
    return services_pb2.Down()

并且在 Go clienterror 对象是(其中一个)结果参数:

stream, err := client.RouteChat(ctx)
if err != nil {
log.Fatalf("%v.RouteChat(_) = _, %v", client, err)
}

不幸的是,官方文档似乎没有明确涵盖错误处理实践。

我在 http://avi.im/grpc-errors/ 找到了一个很好的第 3 方引用资料

关于python - Go 中的 gRPC 服务器与 Python 中的客户端之间的兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51012776/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com