首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关闭python中的SimpleXMLRPCServer服务器

关闭python中的SimpleXMLRPCServer服务器
EN

Stack Overflow用户
提问于 2015-09-24 12:55:56
回答 2查看 2.5K关注 0票数 7

目前,我正在使用Python中的SimpleXMLRPCServer模块编写应用程序。

此应用程序的基本目标是在服务器上继续运行,并不断检查队列中的任何任务。如果它在队列中遇到任何新请求,则为请求服务。

我想要做的事情的快照:

类MyClass():

代码语言:javascript
复制
"""
This class will have methods which will be exposed to the clients
"""
def __init__(self):
    taskQ = Queue.Queue()

def do_some_task(self):
    while True:
         logging.info("Checking the Queue for any Tasks..")
         task = taskQ.get()
         # Do some processing based on the availability of some task

Main

如果 ==命名为"main":

代码语言:javascript
复制
server = SimpleXMLRPCServer.SimpleXMLRPCServer((socket.gethostname(), Port)
classObj = MyClass()
rpcserver.register_function(classObj.do_some_task)
rpcserver.serve_forever()

一旦服务器启动,它将永远停留在do_some_task方法中的循环中,以继续检查队列中的任何任务。这就是我想要达到的目标。但是现在我想优雅地关闭服务器。在这种情况下,我无法关闭服务器。

到目前为止,我已经尝试使用全局标志STOP_SERVER作为'True‘,并在do_some_task while循环中检查它的状态,以退出它并停止服务器。但帮不上忙。

尝试使用SimpleXMLRPCServer的method ()方法,但似乎进入了某种无限循环。

您能建议一些适当的方法来优雅地关闭服务器吗?

提前感谢

EN

回答 2

Stack Overflow用户

发布于 2019-11-25 10:01:47

如果您想要手动关闭它,则应该使用handle_request()而不是serve_forever()。因为SimpleXMLRPCServer是作为单个线程实现的,serve_forever()将使服务器实例运行到一个无限循环中。

您可以参考这个文章。这是引用的一个例子:

代码语言:javascript
复制
from SimpleXMLRPCServer import *

class MyServer(SimpleXMLRPCServer):

    def serve_forever(self):
        self.quit = 0
        while not self.quit:
            self.handle_request()


def kill():
    server.quit = 1
    return 1


server = MyServer(('127.0.0.1', 8000))
server.register_function(kill)

server.serve_forever()

通过使用handle_request(),此代码使用状态变量self.quit指示是否退出无限循环。

票数 2
EN

Stack Overflow用户

发布于 2021-11-30 16:52:10

serve_forever函数是从名为BaseServer套接字服务器模块中的基类继承的。如果您查看这个函数,您将看到它有一个名为__shutdown_request的属性,它可以用于中断服务while循环。由于使用了双下划线,您必须访问这个变量,并将其命名为_BaseServer__shutdown_request

将所有这些放在一起,您可以创建一个非常简单的退出函数,如下所示:

代码语言:javascript
复制
from xmlrpc.server import SimpleXMLRPCServer

class MyXMLRPCServer(SimpleXMLRPCServer):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.register_function(self.quit)
    
    def quit(self):
        self._BaseServer__shutdown_request = True
        return 0
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32761913

复制
相关文章

相似问题

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