首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在单独的线程中运行SimpleXMLRPCServer并关闭

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

Stack Overflow用户
提问于 2009-02-02 08:59:41
回答 3查看 4.5K关注 0票数 6

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

这是我的ServerThread:

代码语言:javascript
复制
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()

问题是,如果线程已经在等待handle_request中的请求,那么调用ServerThread.stop(),然后调用Thread.stop()和Thread.join()将不会导致线程正常停止。由于这里似乎没有任何中断或超时机制可供我使用,因此我不知道如何干净利落地关闭服务器线程。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-02-02 11:54:29

两个建议。

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

  • 创建一个独立的XMLRPC服务器程序。
  • 使用subprocess.Popen()启动它。
  • 在测试完成后将其删除。在标准操作系统(不是Windows)中,kill运行得很好。然而,在视窗系统中,没有微不足道的终止功能,但却有解决这个问题的方法。

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

票数 1
EN

Stack Overflow用户

发布于 2015-04-03 03:38:12

我也遇到了同样的问题,经过几个小时的研究,我从使用自己的handle_request()循环切换到使用serve_forever()来启动服务器,从而解决了这个问题。

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

我不知道为什么它能工作,而handle_request()循环却不行,但它确实能工作。

下面是我的代码:

代码语言:javascript
复制
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")
票数 4
EN

Stack Overflow用户

发布于 2019-11-21 14:52:12

这是我的方式。将SIGTERM发送给self。(适用于我)

服务器代码

代码语言:javascript
复制
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()

客户端代码

代码语言:javascript
复制
import xmlrpc.client

c = xmlrpc.client.ServerProxy("http://localhost:8000")
try:
    c.quit()
except ConnectionRefusedError:
    pass
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/502610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档