0

파이썬 스레드에서 간단한 http 서버를 설정하려고합니다.파이썬에서이 스레드가 멈추지 않는 이유는 무엇입니까?

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