【问题标题】:Shutdown an SimpleXMLRPCServer server in python在 python 中关闭 SimpleXMLRPCServer 服务器
【发布时间】:2015-09-24 12:55:56
【问题描述】:

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

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

我正在尝试做的事情的快照:

类 MyClass():

"""
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

主要

如果 name == "ma​​in":

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 的 SHUTDOWN() 方法,但它似乎进入了某种无限循环。

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

提前致谢

【问题讨论】:

  • 来自shutdown() 文档字符串:„阻塞直到循环完成。这必须在 serve_forever() 在另一个线程中运行时调用,否则会死锁。“
  • @BlackJack serve_forever() 在另一个线程中运行,捕获信号并运行 shutdown() 什么都不做......

标签: python shutdown simplexmlrpcserver


【解决方案1】:

如果你想手动关闭它,你应该使用handle_request() 而不是serve_forever()。因为SimpleXMLRPCServer是作为单线程实现的,而serve_forever()会使服务器实例陷入死循环。

您可以参考这个article。这是从那里引用的一个例子:

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】:

    serve_forever 函数继承自 socketserver 模块中名为 BaseServer 的基类。如果你看一下这个函数,你会发现它有一个名为__shutdown_request 的属性,它可以用来中断服务的while循环。由于有双下划线,您必须使用其错位名称访问变量:_BaseServer__shutdown_request

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

    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
    

    【讨论】:

      猜你喜欢
      • 2014-06-27
      • 1970-01-01
      • 2011-06-12
      • 2017-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-19
      相关资源
      最近更新 更多