6

我有一个类,我希望通过 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_request 中的请求。而且由于这里似乎没有我可以使用的任何中断或超时机制,我不知道如何干净地关闭服务器线程。

4

3 回答 3

4

我遇到了同样的问题,经过数小时的研究,我通过从使用自己的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")
于 2015-04-02T19:38:11.620 回答
1

两个建议。

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

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

  • 开始它subprocess.Popen()

  • 测试完成后杀死它。在标准操作系统(不是 Windows)中,kill 效果很好。然而,在 Windows 中,没有简单的 kill 功能,但有一些方法可以做到这一点。

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

于 2009-02-02T11:54:29.483 回答
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
于 2019-11-21T06:52:12.093 回答