如何在Python中关闭ZeroMQ zmq.proxy?

如何在Python中关闭ZeroMQ zmq.proxy?,proxy,daemon,zeromq,shutdown,Proxy,Daemon,Zeromq,Shutdown,我用Python实现了一个“网络服务”超类,如下所示: class NetworkService (threading.Thread): """ Implements a multithreaded network service """ # Class Globals (ie, C++ class static) ZmqContext = zmq.Context.instance() # ======================

我用Python实现了一个“网络服务”超类,如下所示:

class NetworkService (threading.Thread):

    """
        Implements a multithreaded network service
    """

    # Class Globals (ie, C++ class static)
    ZmqContext = zmq.Context.instance()

    # ==========================================================================================
    # Class Mechanics
    # ==========================================================================================

    def __init__(self, name, port, conc=4):
        """
            Network service initilization
        """
        self.service_name = name
        self.service_port = port
        self.concurrency = conc
        self.handler_url = "inproc://" + name
        self.client_url = "tcp://*:" + str(port)
        self.shutdown = True # Cleared in run()
        self.thread = {}
        super(NetworkService, self).__init__()

    # ==========================================================================================
    # Class Operation
    # ==========================================================================================

    def run(self): # Called [only] by threading.Thread.start()
        self.shutdown = False

        clients = NetworkService.ZmqContext.socket(zmq.ROUTER)
        clients.bind(self.client_url)

        handlers = NetworkService.ZmqContext.socket(zmq.DEALER)
        handlers.bind(self.handler_url)

        for i in range(self.concurrency):
            self.thread[i] = threading.Thread(target = self.handler, name = self.service_name + str(i))
            self.thread[i].daemon = True
            self.thread[i].start()

        zmq.proxy(clients, handlers)
        clients.close()
        handlers.close()

    def terminate(self):
        self.shutdown = True

    def handler(self):
        socket = NetworkService.ZmqContext.socket(zmq.REP)
        socket.connect(self.handler_url)
        iam = repr(get_pids()[2])
        log.info("nsh@%s is up", iam)
        while not self.shutdown:
            string = socket.recv()
            toe = datetime.utcnow()
            command = pickle.loads(string)
            reply = self.protocol(command)
            string = pickle.dumps(reply)
            socket.send(string)

    def protocol(self, command): # Override this in subclass
        reply = {}
        reply["success"] = False
        reply["detail"] = "No protocol defined (NetworkService.protocol(...) not overridden)"
        if "ident" in command:
            reply["ident"] = command["ident"]
        return reply
问题在于行“
zmq.proxy(客户端、处理程序)
”:我似乎无法结束它。曾经如果所有处理程序都终止,仍然
zmq.proxy()
不会返回。我不介意创建一个独立的线程来运行代理,但这是一个我希望能够完全关闭的守护进程

我在文档中读到,这是
zmq.proxy
的正确行为,但在我看来并不正确;-}


有谁能推荐一个近似的等价程序,一旦处理程序线程终止,它就可以关闭?

API基本上意味着必须终止上下文。您可以在具有共享上下文的单独线程中运行代理,然后终止它,zmq.ContextTerminated除外

try:
    zmq.proxy(self.frontend, self.backend)
except zmq.ContextTerminated:
    # cleanup if needed