【问题标题】:How to shutdown gRPC server from gRPC client in python?如何在 python 中从 gRPC 客户端关闭 gRPC 服务器?
【发布时间】:2020-04-03 08:00:32
【问题描述】:


我有一个 gRPC HelloWorld 服务器正在运行,如官方入门指南 (https://grpc.io/docs/quickstart/python/) 中所示。 我现在想从客户端关闭/终止服务器,可能是通过调用服务器方法。
我知道这是可以做到的,因为我阅读了这篇关于如何在 C++ 中做到这一点的文章。 How to shutdown gRPC server from Client (using RPC function)

我的编程语言是用于客户端和服务器的 python。任何帮助将不胜感激。

【问题讨论】:

    标签: python grpc grpc-python


    【解决方案1】:

    就像在 C++ 中一样,从处理程序调用 Server.stop() 会出现问题。相反,您应该使用 threading.Event 在您的服务程序线程和处理程序线程之间进行协调。

    在你的主线程中,做类似的事情

    stop_event = threading.Event()
    server = grpc.server(futures.ThreadPoolExecutor())
    foo_pb2_grpc.add_FooServicer_to_server(Foo(stop_event), server)
    server.add_insecure_port(...)
    server.start()
    stop_event.wait()
    server.stop()
    

    然后在您的服务中,设置请求关闭时的事件:

    class Foo(foo_pb2_grpc.FooServicer):
        def __init__(self, stop_event):
            self._stop_event = stop_event
    
        def Stop(self, request, context):
            self._stop_event.set()
            return foo_pb2.ShutdownResponse()
    

    【讨论】:

    • server.wait_for_termination() 源代码中似乎有一个警告:threading.Event().wait() 不适用于跨平台的 CTRL+C。这会影响解决方案吗?
    • 1.这个例子没有使用wait_for_termination() 2。你能澄清一下“不适用于CTRL+C”是什么意思吗?这个问题是关于如何基于 RPC 关闭服务器,而不是基于 CTRL+C。您想知道如何根据这两个事件之一关闭服务器吗?
    猜你喜欢
    • 2020-09-09
    • 2021-04-10
    • 2015-12-06
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 2016-10-06
    • 2016-01-27
    • 2017-02-11
    相关资源
    最近更新 更多