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

时间:2009-02-02 08:59:41

标签: python multithreading simplexmlrpcserver

我有一个类,我希望通过python中的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中等待请求,则不会导致线程正常停止。由于这里似乎没有任何可以使用的中断或超时机制,我对如何干净地关闭服务器线程感到茫然。

3 个答案:

答案 0 :(得分: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")

答案 1 :(得分:1)

两个建议。

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

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

  • subprocess.Popen()开头。

  • 测试完成后杀死它。在标准操作系统(不是Windows)中,kill非常有效。然而,在Windows中,没有琐碎的杀戮功能,但是有这方面的配方。

另一个建议是在XMLRPC服务器中使用一个导致服务器自毁的功能。您定义了一个调用sys.exit()os.abort()的函数,或者引发一个类似的异常来阻止该过程。

答案 2 :(得分:0)

这是我的方式。将SIGTERM发送给自己。 (对我有用)

服务器代码

import os
import signal
import xmlrpc.server

server = xmlrpc.server.SimpleXMLRPCServer(("0.0.0.0", 8000))
server.register_function(lambda: os.kill(os.getpid(), signal.SIGTERM), 'quit')
server.serve_forever()

客户代码

import xmlrpc.client

c = xmlrpc.client.ServerProxy("http://localhost:8000")
try:
    c.quit()
except ConnectionRefusedError:
    pass