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

标签 python multithreading simplexmlrpcserver

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

最佳答案

我遇到了同样的问题,经过数小时的研究,我解决了这个问题,方法是从使用我自己的 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")

关于python - 在单独的线程中运行 SimpleXMLRPCServer 并关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/502610/

相关文章:

python - python audiotools卡在get_metadata()

python - 简单的 XMLRPC 服务器 python

java - 代码(java,多线程)执行到一行代码后停止

java - Java 中的 64 位分配在 32 位机器上是原子的吗?

python - 如何将 xmlrpc 服务器的日志输出重定向到某个文件

Python 的 xmlrpc 极慢 : one second per call

python - 如何重置 Spyder IDE (Python 2.7) 图形用户界面?

javascript - 带有handlebar.js的 Pyramid 应用程序: I don't need a template for this view; how to disable?

Python Altair 绘制两个偏差标准

c++ - tbb::parallel_for 是否总是利用调用线程