2016-07-05 6 views
5

私はPythonを初めて使い、Pythonで単純なhttpserverを書いています。私は、サーバーからサーバーへの要求をシャットダウンしようとしています。ハンドラからサーバーの関数を呼び出すこの機能をどのように達成できますか?httprequestハンドラからPythonでsimplehttpserverを停止するには?

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

、およびPythonのスレッドが突然閉じることができないので、あなたも、あなたのサーバshut_down方法としてそれを使用する必要があります。

def shut_down(self): 
    self._server.shutdown() 
関連する問題