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?
¿Cómo se envía la señal de SIG_INT al proceso? – Tisho
@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
Ok, al menos sabemos que la señal SIGKILL funciona. Si vincula SIGKILL al cierre, ¿funcionará? – Tisho