2012-06-06 9 views
5

Mientras jugaba con la biblioteca estándar, he encontrado una extraña diferencia entre python2 y python3. Si trato de captar una señal en python2 mientras TCPServer se está ejecutando en un hilo diferente, la señal no se maneja, pero en python3 sí lo hace.Python 2 no maneja las señales si TCPServer se está ejecutando en otra secuencia

Aquí es un script que reproduce el problema

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") 

Ésta es la salida de python3:

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

Y esto es de python2:

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

"^ C" es una interrupción del teclado y "Killed" es sigkill que envié a un proceso.

¿Por qué no se llamó al apagado?

+0

¿Cómo se envía la señal de SIG_INT al proceso? – Tisho

+0

@Tisho en sistemas POSIX, Control-C hace que el programa activo reciba una señal SIGINT. [wiki] (http://en.wikipedia.org/wiki/Control-C#In_command-line_environments) – Blin

+0

Ok, al menos sabemos que la señal SIGKILL funciona. Si vincula SIGKILL al cierre, ¿funcionará? – Tisho

Respuesta

4

Para mí, parece que thread.join() hace un bloqueo y evita que se adhiera la señal.

He probado el código siguiente en Python 2.7 y parece que funciona:

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") 
Cuestiones relacionadas