数字鲁班 2024-11-28 08:58 采纳率: 50%
浏览 20
已结题

grpc 服务端,如何在 接收到 客户端 关闭的 消息后,关闭 grpc 服务端。

grpc 服务端,如何在 接收到 客户端 关闭的 消息后,关闭 grpc 服务端。

哪位 能帮 补充 server 关闭代码

from concurrent import futures
import logging

import grpc
import helloworld_pb2
import helloworld_pb2_grpc


class Greeter(helloworld_pb2_grpc.GreeterServicer):
    def SayHello(self, request, context):
        print("接收到信息:",request.name)
        if request.name=="close" :
                server 关闭代码
        return helloworld_pb2.HelloReply(message="Done" )   

def serve():
    port = "50051"
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)
    server.add_insecure_port("[::]:" + port)
    server.start()
    print("Server started, listening on " + port)
    server.wait_for_termination()


if __name__ == "__main__":
    logging.basicConfig()
    serve()

  • 写回答

1条回答 默认 最新

  • JavaPub-rodert 领域专家: 后端开发技术领域 2024-11-28 09:54
    关注
    > 本答案参考多次询问 ChatGPT-3.5 后选择的最佳回答,若是满意,还请采纳,谢谢
    

    在gRPC服务端中,如果你想在接收到特定消息后关闭服务端,你可以在服务端的RPC方法中检查消息内容,并在满足条件时调用服务端的stop方法。以下是补充的代码示例:

    from concurrent import futures
    import logging
    import grpc
    import helloworld_pb2
    import helloworld_pb2_grpc
    
    class Greeter(helloworld_pb2_grpc.GreeterServicer):
        def SayHello(self, request, context):
            print("接收到信息:", request.name)
            if request.name == "close":
                # 调用服务端的stop方法来关闭服务端
                self.server.stop(grace=None)  # None表示立即停止,不等待正在处理的RPC调用完成
            return helloworld_pb2.HelloReply(message="Done")
    
    def serve():
        port = "50051"
        server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
        helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)
        server.add_insecure_port("[::]:" + port)
        server.start()
        print("Server started, listening on " + port)
        server.wait_for_termination()
    
    if __name__ == "__main__":
        logging.basicConfig()
        serve()
    

    在上述代码中,self.server 是对gRPC服务端实例的引用。你需要在Greeter类中添加一个server属性来保存这个引用。修改后的Greeter类如下:

    class Greeter(helloworld_pb2_grpc.GreeterServicer):
        def __init__(self):
            self.server = None  # 添加server属性
    
        def set_server(self, server):
            self.server = server  # 在服务端启动时设置server引用
    
        def SayHello(self, request, context):
            print("接收到信息:", request.name)
            if request.name == "close":
                self.server.stop(grace=None)  # None表示立即停止,不等待正在处理的RPC调用完成
            return helloworld_pb2.HelloReply(message="Done")
    

    然后在serve函数中,你需要在添加服务到服务器时设置Greeter实例的server属性:

    def serve():
        port = "50051"
        server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
        greeter = Greeter()
        greeter.set_server(server)  # 设置Greeter实例的server引用
        helloworld_pb2_grpc.add_GreeterServicer_to_server(greeter, server)
        server.add_insecure_port("[::]:" + port)
        server.start()
        print("Server started, listening on " + port)
        server.wait_for_termination()
    

    这样,当服务端接收到名为"close"的消息时,就会调用stop方法来关闭服务端。请注意,stop方法会立即停止服务端,如果你有需要完成的清理工作,可能需要设置一个适当的grace时间来优雅地关闭服务端。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月9日
  • 已采纳回答 12月1日
  • 创建了问题 11月28日