2016-07-05 5 views
5

Ich bin neu bei Python und schrieb einen einfachen httpserver in Python. Ich versuche, den Server von der Anfrage zum Server herunterzufahren. Wie erreiche ich diese Funktionalität beim Aufruf einer Funktion des Servers vom Handler?Wie stoppe ich einen einfachenhttpserver in Python von httprequest Handler?

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

Antwort

2

Kurz gesagt, verwenden Sie nicht server.serve_forver(..). Der Anforderungshandler verfügt über ein -Attribut, mit dem Sie mit der Hauptserverinstanz kommunizieren können, um eine Art Flag festzulegen, die dem Server mitteilt, wann er anhalten soll.

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

Der Server ist normalerweise vom Handler aus über das Attribut server zugänglich. Ein HTTPServer, der mit server_forerver gestartet wurde, kann mit der Methode shutdown() heruntergefahren werden. Leider, auch wenn dies nicht dokumentiert ist, können Sie das Herunterfahren nicht vom Thread aus aufrufen, der die Serverschleife ausführt, da dies zu einem Deadlock führt. So könnten Sie dies in Ihrer do_GET-Handler-Methode schreiben:

def do_GET(self): 
    # send something to requester... 
    if self.path == '/shutdown': 
     t = threading.Thread(target = self.server.shutdown) 
     t.daemon = True 
     t.start() 

Diese sauber das Thread beenden lassen, und Sie sollen auch, wie Sie Server shut_down Methode verwenden, da Python Threads kann nicht abrupt geschlossen:

def shut_down(self): 
    self._server.shutdown() 
Verwandte Themen