[英]Shutdown an SimpleXMLRPCServer server in python
目前我正在使用 Python 中的 SimpleXMLRPCServer 模塊編寫應用程序。
此應用程序的基本目標是繼續在服務器上運行並繼續檢查隊列中的任何任務。 如果它在隊列中遇到任何新請求,則為該請求提供服務。
我正在嘗試做的快照:
類 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
如果名稱==“主要”:
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() 方法,但它似乎進入了某種無限循環。
您能否建議一些適當的方法來優雅地關閉服務器。
提前致謝
如果您想serve_forever()
關閉它,您應該使用handle_request()
而不是serve_forever()
。 因為SimpleXMLRPCServer
是作為單線程實現的,而serve_forever()
會使服務器實例陷入無限循環。
你可以參考這篇文章。 這是從那里引用的一個例子:
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
來指示是否退出無限循環。
serve_forever
函數繼承自名為BaseServer
的socketserver模塊中的基類。 如果您查看此功能,您會看到它有一個名為__shutdown_request
的屬性,這可用於中斷服務 while 循環。 由於雙下划線,您必須訪問其名稱_BaseServer__shutdown_request
的變量: _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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.