代码之家  ›  专栏  ›  技术社区  ›  Staale

在单独的线程中运行simplexmlRpcServer并关闭

  •  2
  • Staale  · 技术社区  · 15 年前

    我有一个类希望通过Python中的simplexmlRpcServer进行测试。我设置单元测试的方法是创建一个新线程,并在其中启动simplexmlRpcServer。然后我运行所有测试,最后关闭。

    这是我的服务器线程:

    class ServerThread(Thread):
        running = True
        def run(self):
            self.server = #Creates and starts SimpleXMLRPCServer
    
            while (self.running):
                self.server.handle_request()
    
        def stop(self):
            self.running = False
            self.server.server_close()
    

    问题是,如果调用serverThread.stop(),然后调用thread.stop()和thread.join(),那么如果线程已经在handle_请求中等待请求,那么它不会导致线程正确停止。由于这里似乎没有任何我可以使用的中断或超时机制,我对如何干净地关闭服务器线程感到困惑。

    2 回复  |  直到 9 年前
        1
  •  1
  •   S.Lott    15 年前

    两个建议。

    建议一是使用单独的进程,而不是单独的线程。

    • 创建一个独立的xmlrpc服务器程序。

    • 启动它 subprocess.Popen() .

    • 当测试完成后杀死它。在标准操作系统(而不是Windows)中,kill工作得很好。然而,在Windows中,并没有简单的杀戮功能,但有一些方法可以解决这个问题。

    另一个建议是在xmlrpc服务器中有一个函数,它会导致服务器自我破坏。定义一个调用 sys.exit() os.abort() 或者引发一个类似的异常,该异常将停止进程。

        2
  •  3
  •   szuuuken    9 年前

    我也有同样的问题,经过数小时的研究,我从使用我自己的解决了这个问题。 处理请求() 循环到 Services前缀() 启动服务器。

    Services前缀() 启动一个类似于您的内部循环。可以通过调用 关闭() . 停止循环后,可以使用 ServiListCo() .

    我不知道这为什么有效 处理请求() 循环不,但确实如此;p

    这是我的代码:

    from threading import Thread
    from xmlrpc.server import SimpleXMLRPCServer
    from pyWebService.server.service.WebServiceRequestHandler import WebServiceRquestHandler
    
    class WebServiceServer(Thread):
        def __init__(self, ip, port):
            super(WebServiceServer, self).__init__()
            self.running = True
            self.server = SimpleXMLRPCServer((ip, port),requestHandler=WebServiceRquestHandler)
        self.server.register_introspection_functions()
    
        def register_function(self, function):
            self.server.register_function(function)
    
        def run(self):
            self.server.serve_forever()
    
        def stop_server(self):
            self.server.shutdown()
            self.server.server_close()
    
    print("starting server")
    webService = WebServiceServer("localhost", 8010)
    webService.start()
    print("stopping server")
    webService.stop_server()
    webService.join()
    print("server stopped")
    
    推荐文章