0

私は、Pythonで単純なhttpサーバをスレッド内にセットアップしようとしています。なぜこのスレッドはPythonで停止していませんか?

class MyHandler(SimpleHTTPRequestHandler): 
    def do_GET(self): 
     if self.path == '/shutdown': 
      print 'Got shutdown request' 
      self.server.running = False 
     self.send_response(200) 

class Server(): 

    def __init__(self): 
    self._http_server = HTTPServer(('0.0.0.0', 8123), MyHandler) 
    self._http_server.running = True 
    self._http_server_thread = threading.Thread(target = self._run_http_server, name = 'serverthread') 
    self._http_server_thread.start() 


    def _run_http_server(self): 
     print 'Server started' 
     while(self._http_server.running): 
      self._http_server.handle_request() 

     print 'Server finished serving' 
     self._http_server.shutdown() 


    def check_status(self): 
     l = threading.enumerate() 
     for i in l: 
      print i.name 


serv = Server() 
print 'Sleeping for 20 seconds' 
time.sleep(20) 
req = urllib2.urlopen('http://127.0.0.1:8123/shutdown') 
print 'Finished sleeping' 
serv.check() 

私の仮定は_run_http_serverの実行が終了後、スレッドが実行を停止する必要がありますが、それはこの出力を得るdoesn't.Iが、スレッドが稼働し続けています。スレッドが停止しない理由を誰でも指摘できますか?

Server started 
Sleeping for 20 seconds 
Got shut down request 
127.0.0.1 - - [09/Jul/2016 12:17:17] "GET /shutdown HTTP/1.1" 200 - 
Server finished serving 
Finished sleeping 
MainThread 
serverthread 
True 

答えて

2

コードには、HTTPServer.serve_forever()の代わりに独自のリクエスト処理ループがあります。しかし、HTTPServer.shutdown()に電話すると、serve_forever()ループに停止するまで待ってから終了するまで待つように指示します。 serve_forever()は起動していないため、shutdown()は返されません(実際にはserve_forever()が開始してすぐに停止するのを待っています)。 self._http_server.shutdown()行を削除すると、問題が修正されます。

+0

ありがとうございます!何かを学んだ。 – user1429322

関連する問題