2014-03-05 2 views
4

비동기 (스레딩) SocketServer http://docs.python.org/2/library/socketserver.html의 예에서는 서버 스레드 (server_thread)가 시작되어 각 요청에 대해 새 스레드를 시작합니다. KeyboardInterrupts를 잡는 데 몇 가지 문제가 있기 때문에 비슷한 코드를 찾기 시작했고 서버 스레드를 사용하지 않을 때 명백한 차이가 없다는 것을 알았지 만 ctrl-c가 실제로 작동합니다.SocketServer ThreadingMixIn of server_thread

server_thread를 사용하는 경우 내 코드는 내가 아주 많이

1) 왜 단순한 '시도가'KeyboardInterrupt 작업을 잡으려고하지 않습니다 알고 싶습니다 작동하더라도?

2)이 예제의 server_thread는 어떤 좋은 점이 있습니까? 시도에 keyboardinterrupt 잡기 파이썬 SocketServer 예에서

은 작동하지 않습니다

if __name__ == "__main__": 
    server = ThreadedTCPServer(serverAddr, SomeCode) 
<snip> 
    # Start a thread with the server -- that thread will then start one 
    # more thread for each request 
    server_thread = threading.Thread(target=server.serve_forever) 
    server_thread.start() 

내 간단한 예를 들어, CTRL-C의 작품.

답변

3

1) 일반적인 문제입니다. Ctrl + C를 누르면 신호가 프로세스로 전송됩니다. 이 과정에서 주 스레드가 신호를 포착하고 주 스레드가 인터럽트되면 (적절하게 처리되지 않는 경우) 하지만 그 신호는 다른 스레드를 죽이지 않습니다. 그리고 파이썬은 비 데몬 스레드가 실행되는 동안 종료하지 않습니다 (안전하지 않기 때문에). 당신은 당신이 무엇을하고 있는지 알고 있다면 당신은이를 추가 할 수 있습니다

server_thread = threading.Thread(target=server.serve_forever) 
server_thread.daemon = True 
server_thread.start() 

하고 지금은 (당신이 대기와 같은 server_thread.start() 후 뭔가를 할 가정 - 그렇지 않으면 파이썬은 그냥이 데몬 스레드를 기다리지 않습니다 종료됩니다) 작동합니다. 그러나 중요한 작업 중에는 서버를 종료 할 수 있습니다. 당신이 우아한 죽의 일종 구현하는 것을 방지하기 위해 :

import signal 

if __name__ == "__main__": 
    server = ThreadedTCPServer(serverAddr, SomeCode) 

    # some code 
    server_thread = threading.Thread(target=server.serve_forever) 
    server_thread.start() 
    # some code 

    try: 
     signal.pause() # wait for a signal, perhaps in a loop? 
    except: 
     server.shutdown() # graceful quit 

2) 그냥 별도의 스레드에서 서버를 시작합니다. 아마도 그 동안 다른 작업을 할 수있는 아이디어 였을 것입니까? 서버 만 실행하려는 경우에는 필요가 없습니다.

이유는 위에서 언급 한 이유가 될 수 있습니다. : graceful quit. 서버를 중단하면 일부 중요 작업 중에 서버가 중단됩니다.

+0

'serve_forever()'에서 ThreadedTCPServer를 중단 할 수 있습니다. 그것은 아무 것도 중요하지 않습니다. 중요한 작업은 핸들러 스레드에서 기다리고 싶을 수 있습니다. – User

1

서버 스레드 예에서 콘텐츠를 제공하는 새 스레드를 시작합니다. 이 스레드는 deamon (deamon = False)이 아닌 시작됩니다. 즉, server_forever()이 완료 될 때까지 프로그램이 종료되지 않습니다. 따라서 주 스레드는 아무 작업도 수행하지 않으며 프로그램은 비 데몬 스레드가 닫힐 때까지 대기합니다.

  1. 유일한 차이점은이 새 스레드는 주 스레드가 아니며 따라서 주 스레드가 수행하는 KeyboardInterrupt 또는 다른 작업을 처리하지 않는다는 것입니다.
  2. GUI를 서버와 통합하려는 경우 유용 할 수 있습니다. GUI는 병렬로 실행될 수 있습니다.
+0

'print'ctrl-c를 끝내려면 'c'가 여전히 실행되므로 try가 작동 할 것으로 예상됩니다. 방금 server_thread에 남아 있으면 인쇄가 작동해서는 안됩니다. 그렇지 않습니까? – user135361

+0

죄송합니다, 어떤 인쇄를 의미합니까? 더 설명해 주시겠습니까? – User