gRPC Python服务类与Serve方法拆分后调用失败,为何示例均同文件?
问题原因与解决方案
核心问题
你在main.py里实例化的是gRPC自动生成的空基类,而非你自己实现了业务逻辑的子类,导致gRPC服务器找不到对应的方法实现,返回UNIMPLEMENTED错误。
具体分析
- 在
ems_validator_service.py中,你定义了一个继承自gRPC生成的EmsValidatorServiceServicer的子类,并且实现了Validate和GetStatus两个方法。 - 但在
main.py的导入语句里,你从ems_validator_service_pb2_grpc(protoc生成的代码文件)导入了原始的EmsValidatorServiceServicer基类——这个基类里的方法都是默认未实现的,只会抛出"Method not implemented!"错误。 - 当你把
serve()移到服务类所在文件时,你实例化的是自己写的子类,所以方法能正常被识别和调用。
修复步骤
修改main.py的导入部分,替换成你自己实现的子类:
from validator.src.ems_validator_service import EmsValidatorServiceServicer # 导入自定义子类 from validator.src.grpc.ems_validator_service_pb2_grpc import add_EmsValidatorServiceServicer_to_server from concurrent import futures import grpc def serve(): server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) add_EmsValidatorServiceServicer_to_server(EmsValidatorServiceServicer(), server) server.add_insecure_port('localhost:50051') server.start() server.wait_for_termination() if __name__ == "__main__": serve()
补充说明
这是Python的导入特性导致的问题,和gRPC本身无关——Python会严格按照你指定的模块路径加载对应的类,你之前误导入了protoc生成的空基类,而非你自定义的实现类,才引发了错误。
内容的提问来源于stack exchange,提问作者Hasan
相关产品推荐
相关产品推荐

