2014-03-04 5 views
2

:사용자 정의 핸들러에 의해 파이썬 tcpserver는 종료 내가 창이 닫힐 때 클라이언트가 GET 요청을 통해 SocketServer 모듈에서 tcpserver는이 방출 그러나 다음 코드는 종료 시작에 실패 종료하기 위해 노력하고있어

def show_webgl(data): 
    import SocketServer 
    import SimpleHTTPServer 
    from webbrowser import open 

    PORT = 8000 
    RUNNING = True 

    class CustomHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): 
     def do_GET(self): 
      if self.path=='/atom.json': 
       # return data 
       return 
      elif self.path == '/shutdown': 
       httpd.shutdown() 
       # quit server, this line is never reached 
      else: 
       # serve other files 
       SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self) 


    SocketServer.BaseServer.allow_reuse_address = True 
    httpd = SocketServer.TCPServer(('0.0.0.0', 8000), CustomHandler) 

    print "serving at port", PORT 
    open('http://localhost:8000/three.html') 
    httpd.serve_forever()  

    print 'closed' 

답변

4

해결 방법 1

는 ThreadingHTTPServer를 사용합니다.

class ThreadingHTTPServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer): 
    allow_reuse_address = True 

귀하의 코드 :

import SocketServer 
import SimpleHTTPServer 
import BaseHTTPServer 
from webbrowser import open 
import hanging_threads 

PORT = 8005 
RUNNING = True 

class CustomHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): 
    def do_GET(self): 
     print "GET" 
     if self.path=='/atom.json': 
      # return data 
      return 
     elif self.path == '/shutdown': 
      httpd.shutdown() 
      print 'shutdown' 
      # quit server, this line is never reached 
     else: 
      # serve other files 
      SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self) 


class ThreadingHTTPServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer): 
    allow_reuse_address = True 

httpd = ThreadingHTTPServer(('0.0.0.0', PORT), CustomHandler) 

print "serving at port", PORT 
open('http://localhost:{}/three.html'.format(PORT)) 
httpd.serve_forever() 

print 'closed' 

해결 방법 2

는 종료와 스레드를 시작

. 그것은 중단 여기서

import threading 
threading.Thread(target = httpd.shutdown).start() 

컨텍스트

이다.

def serve_forever(self, poll_interval=0.5): 
    """Handle one request at a time until shutdown. 

    Polls for shutdown every poll_interval seconds. Ignores 
    self.timeout. If you need to do periodic tasks, do them in 
    another thread. 
    """ 
    self.__is_shut_down.clear() 
    try: 
     while not self.__shutdown_request: 
      # XXX: Consider using another file descriptor or 
      # connecting to the socket to wake this up instead of 
      # polling. Polling reduces our responsiveness to a 
      # shutdown request and wastes cpu at all other times. 
      r, w, e = _eintr_retry(select.select, [self], [], [], 
            poll_interval) 
      if self in r: 
       self._handle_request_noblock() 
    finally: 
     self.__shutdown_request = False 
     self.__is_shut_down.set() 

def shutdown(self): 
    """Stops the serve_forever loop. 

    Blocks until the loop has finished. This must be called while 
    serve_forever() is running in another thread, or it will 
    deadlock. 
    """ 
    self.__shutdown_request = True 
    self.__is_shut_down.wait() 

그래서 self._handle_request_noblock()이 메소드를 호출하고 서버가 serve_forever() 탈퇴에 대한 다음 shutdown() 기다리는 : hanging_threads.py

httpd.serve_forever() 
    File "C:\Python27\lib\SocketServer.py", line 238, in serve_forever 
    self._handle_request_noblock() 
    File "C:\Python27\lib\SocketServer.py", line 295, in _handle_request_noblock 
    self.process_request(request, client_address) 
    File "C:\Python27\lib\SocketServer.py", line 321, in process_request 
    self.finish_request(request, client_address) 
    File "C:\Python27\lib\SocketServer.py", line 334, in finish_request 
    self.RequestHandlerClass(request, client_address, self) 
    File "C:\Python27\lib\SocketServer.py", line 649, in __init__ 
    self.handle() 
    File "C:\Python27\lib\BaseHTTPServer.py", line 340, in handle 
    self.handle_one_request() 
    File "C:\Python27\lib\BaseHTTPServer.py", line 328, in handle_one_request 
    method() 
    File "C:/Users/wollknaeul/Desktop/httpservertest.py", line 17, in do_GET 
    httpd.shutdown() 
    File "C:\Python27\lib\SocketServer.py", line 251, in shutdown 
    self.__is_shut_down.wait() 
    File "C:\Python27\lib\threading.py", line 618, in wait 
    self.__cond.wait(timeout) 
    File "C:\Python27\lib\threading.py", line 339, in wait 
    waiter.acquire() 

일부 코드를 사용. 일어날 수 없다.