[英]How to stop a simplehttpserver in python from httprequest handler?
我是python的新手,在python中編寫了一個簡單的httpserver。 我試圖關閉服務器從請求到服務器。 如何從處理程序中實現調用服務器功能的這一功能?
class MyHandler(SimpleHTTPRequestHandler):
def do_GET(self):
if self.path == '/shutdown':
pass # I want to call MainServer.shutdown from here
class MainServer()
def __init__(self, port = 8123):
self._server = HTTPServer(('0.0.0.0', port), MyHandler)
self._thread = threading.Thread(target = self._server.serve_forever)
self._thread.deamon = True
def start(self):
self._thread.start()
def shut_down(self):
self._thread.close()
簡而言之,不要使用server.serve_forver(..)
。 請求處理程序具有self.server
屬性,您可以使用該屬性與主服務器實例進行通信,以設置某種標志,告訴服務器何時停止。
import threading
from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer
class MyHandler(BaseHTTPRequestHandler):
def do_GET(self):
if self.path == '/shutdown':
self.server.running = False
class MainServer:
def __init__(self, port = 8123):
self._server = HTTPServer(('0.0.0.0', port), MyHandler)
self._thread = threading.Thread(target=self.run)
self._thread.deamon = True
def run(self):
self._server.running = True
while self._server.running:
self._server.handle_request()
def start(self):
self._thread.start()
def shut_down(self):
self._thread.close()
m = MainServer()
m.start()
通常可以通過server
屬性從處理程序訪問server
。 可以使用其... shutdown()
方法關閉使用server_forerver
啟動的HTTPServer。 不幸的是,即使沒有記錄,也無法從運行服務器循環的線程調用shutdown,因為它會導致死鎖。 所以你可以在你的do_GET
處理程序方法中寫這個:
def do_GET(self):
# send something to requester...
if self.path == '/shutdown':
t = threading.Thread(target = self.server.shutdown)
t.daemon = True
t.start()
這將干凈地讓線程終止,你也應該在服務器的shut_down
方法中使用它,因為Python線程不能突然關閉:
def shut_down(self):
self._server.shutdown()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.