我有一个在 Go 中运行的 grpc 服务器。我无法使用 python 客户端调用其中的方法。不知道出了什么问题。我收到以下错误
_Rendezvous of RPC that terminated with (StatusCode.UNIMPLEMENTED, method: /com.test/myMethod)>
知道可能出了什么问题吗? Go客户端能够正常通信。
我还按照说明生成了存根https://grpc.io/docs/tutorials/basic/python.html
python -m grpc_tools.protoc -I../../protos --python_out=. --grpc_python_out=. ../../protos/route_guide.proto
获得 py 文件后,我删除了 proto 文件并压缩了包。这个压缩包是我用于 python 客户端的包。有什么问题吗
有时当客户端和服务器使用的协议缓冲区文件的版本处于不一致状态时,我会得到
StatusCode.UNIMPLEMENTED
。
例如,我更改了服务器中的 proto 缓冲区文件,但我忘记更改客户端中的 proto 缓冲区文件。
我不知道这是否有帮助,但有时它发生在我身上。
我尝试重现您的问题并发现:
我们在
server.py
中实现的类名称必须与我们添加到gRPC服务器中的类名称相同。
示例:
class SubClassImplemented(ExtendedClassGenerated):
...
def serve():
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
add_<name>_to_server(SubClassImplemented(), server)
这里,
SubClassImplemented
- 该类继承自生成的类,必须添加到 gRPC 服务器。
ExtendedClassGenerated
- 生成的类存在于<name>_pb2_grpc.py
中
add_<name>_to_server()
- <name>_pb2_grpc.py
中存在的方法,用于将逻辑添加到 gRPC 服务器。
希望这有帮助! 我还添加了相同的屏幕截图。
检查Python客户端中的原始文件是否等于Go服务器中的原始文件。这很关键。
Go 允许跳过原始文件中未使用的 RPC 调用和消息的描述,而 Python 需要所有这些。
我遇到了类似的问题,我更改了服务器和客户端的端口号,然后一切正常。
server.add_insecure_port('[::]:50053')
将 50051 更改为 50053 对我有用。