2016-07-05 60 views
5

我是python的新手,在python中寫了一個簡單的httpserver。我試圖關閉服務器從請求到服務器。我怎樣才能實現從處理程序調用服務器功能的這種功能?如何從httprequest處理程序停止Python中的簡單HTTP服務器?

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() 

回答

2

總之,不要使用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() 
1

服務器通常可以通過server屬性從處理程序訪問。以server_forerver啓動的HTTPServer可以使用其... shutdown()方法關閉。不幸的是,即使沒有記錄,也不能從運行服務器循環的線程中調用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()