2012-06-06 2 views
5

표준 라이브러리를 가지고 놀면서 나는 python2와 python3 사이에 이상한 차이점을 발견했습니다. TCPServer가 다른 스레드에서 실행되는 동안 신호를 잡으려고하면 python2에서 신호를 처리하지 않지만 python3에서는 처리합니다. "^ C"다른 스레드에서 TCPServer가 실행중인 경우 Python 2에서 신호를 처리하지 않습니다.

Starting server thread 
Waiting for server thread to shut down 
^CKilled 

: 여기

이것은 python3로부터 출력

import signal 
import threading 
import sys 
if sys.version_info > (3,0): 
    from socketserver import TCPServer, BaseRequestHandler 
else: 
    from SocketServer import TCPServer, BaseRequestHandler 

def shutdown(signum, frame): 
    print("Shutting down server thread") 
    server.shutdown() 

server = TCPServer(
    ('127.0.0.1', 7654), 
    BaseRequestHandler 
) 
signal.signal(signal.SIGTERM, shutdown) 
signal.signal(signal.SIGINT, shutdown) 
server_thread = threading.Thread(target=server.serve_forever) 
print("Starting server thread") 
server_thread.start() 
print("Waiting for server thread to shut down") 
server_thread.join() 
print("Server thread terminated") 

문제 재생하는 스크립트이다

Starting server thread 
Waiting for server thread to shut down 
^CShutting down server thread 
Server thread terminated 

에게 그리고 이것은 python2 내지 키보드 인터럽트이고 "Killed"는 내가 프로세스로 보낸 sigkill입니다.

왜 종료되지 않았습니까?

+0

이 어떻게 프로세스에 SIG_INT 신호를 보내려면 어떻게합니까? – Tisho

+0

@Tisho POSIX 시스템에서 Control-C는 활성 프로그램이 SIGINT 신호를 받도록합니다. [wiki] (http://en.wikipedia.org/wiki/Control-C#In_command-line_environments) – Blin

+0

적어도 우리는 SIGKILL 신호가 작동한다는 것을 알고 있습니다. SIGKILL을 종료하도록 바인딩하면 작동합니까? – Tisho

답변

4

나를 위해 그것은 thread.join()이 잠그고 신호를 잡는 것을 방해합니다.

는 파이썬 2.7에 다음 코드를 테스트 한 작동하는 것 같다 :

import time 
import signal 
import threading 
import sys 
if sys.version_info > (3,0): 
    from socketserver import TCPServer, BaseRequestHandler 
else: 
    from SocketServer import TCPServer, BaseRequestHandler 

def shutdown(signum, frame): 
    print("Shutting down server thread") 
    server.running = False 
    server.shutdown() 

server = TCPServer(
    ('127.0.0.1', 7654), 
    BaseRequestHandler 
) 
signal.signal(signal.SIGTERM, shutdown) 
signal.signal(signal.SIGINT, shutdown) 
server_thread = threading.Thread(target=server.serve_forever) 
print("Starting server thread") 
server_thread.start() 
server.running = True 
print("Waiting for server thread to shut down") 

while server.running: 
    time.sleep(1) 

server_thread.join() 
print("Server thread terminated") 
관련 문제