如果TCPServer正在另一个线程中运行,Python 2不会处理信号

如果TCPServer正在另一个线程中运行,Python 2不会处理信号,python,signals,socketserver,Python,Signals,Socketserver,在使用标准库时,我发现python2和python3之间有一个奇怪的区别。如果我试图在python2中捕获一个信号,而TCPServer正在另一个线程中运行,则该信号不会得到处理,但在python3中会得到处理 下面是一个重现问题的脚本 import signal import threading import sys if sys.version_info > (3,0): from socketserver import TCPServer, BaseRequestHandl

在使用标准库时,我发现python2和python3之间有一个奇怪的区别。如果我试图在python2中捕获一个信号,而TCPServer正在另一个线程中运行,则该信号不会得到处理,但在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")
这是python3的输出:

Starting server thread
Waiting for server thread to shut down
^CShutting down server thread
Server thread terminated
这是python2中的:

Starting server thread
Waiting for server thread to shut down
^CKilled
“^C”是键盘中断,“kill”是我发送给进程的sigkill


为什么不调用shutdown?

对我来说,似乎thread.join()会产生一些锁并阻止捕捉信号

我已经在Python 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")

如何将SIG_INT信号发送到进程?@Tisho在POSIX系统中,Control-C使活动程序接收SIGINT信号。好吧,至少我们知道SIGKILL信号是有效的。如果你把SIGKILL绑定到关机,它会工作吗?。。。至少这项检查将显示问题可能在哪里。@Tisho:当然,SIGKILL信号不能被捕获除外。