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