2009-02-02 53 views
2

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

这是我ServerThread:

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_request中等待请求。而且由于在这里我似乎没有任何中断或超时机制,所以我不知道如何干净地关闭服务器线程。

回答

1

两个建议。

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

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

  • subprocess.Popen()开始。

  • 测试完成后关闭。在标准操作系统(不是Windows)中,杀手很好地工作。然而,在Windows中,并没有微不足道的杀手功能,但是有这方面的配方。

另一个建议是在你的XMLRPC服务器中有一个导致服务器自毁的函数。您可以定义一个函数,调用sys.exit()os.abort()或引发类似的异常,以停止该过程。

+0

我会保持这种方法铭记未来。我更喜欢跨平台的解决方案,所以关机方法似乎最合理。我通过发送一个虚拟请求来解决这个问题,该请求将以self.running将会终止线程为false。 – Staale 2009-02-03 14:20:45

+0

一个子进程是跨平台的。子过程加上自毁方法效果最好。 – 2009-02-03 14:57:31

3

我有同样的问题,并研究小时后我解决它通过使用我自己的handle_request开关()环路serve_forever()启动服务器。

serve_forever()启动一个类似于您的内部循环。这个循环可以通过调用shutdown()来停止。停止循环后,可以使用server_close()停止服务器。

我不知道为什么这个工程和handle_request()循环不这样做,但它确实,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") 
相关问题