这应该是非常简单的,我很惊讶,我一直无法找到已经在stackoverflow上回答的问题。多线程Python中的信号处理
我有一个程序需要响应SIGTERM和SIGINT信号的守护进程,以便与新贵们一起工作。我读过这样做的最好方法是在与主线程分离的线程中运行程序的主循环,并让主线程处理信号。然后当收到一个信号时,信号处理程序应该通过设置一个常规在主循环中检查的标记标志来告诉主循环退出。
我试过这样做,但它不按我期望的方式工作。请参见下面的代码:
from threading import Thread
import signal
import time
import sys
stop_requested = False
def sig_handler(signum, frame):
sys.stdout.write("handling signal: %s\n" % signum)
sys.stdout.flush()
global stop_requested
stop_requested = True
def run():
sys.stdout.write("run started\n")
sys.stdout.flush()
while not stop_requested:
time.sleep(2)
sys.stdout.write("run exited\n")
sys.stdout.flush()
signal.signal(signal.SIGTERM, sig_handler)
signal.signal(signal.SIGINT, sig_handler)
t = Thread(target=run)
t.start()
t.join()
sys.stdout.write("join completed\n")
sys.stdout.flush()
我测试了在以下两个方面:
1)
$ python main.py > output.txt&
[2] 3204
$ kill -15 3204
2)
$ python main.py
ctrl+c
在这两种情况下,我希望这写到输出:
run started
handling signal: 15
run exited
join completed
在第一种情况,程序退出,但我看到的是:
run started
在当按下CTRL + C和程序不退出SIGTERM信号被忽略貌似第二壳体。
我在这里错过了什么?
尝试用'while t.is_alive():t.join(1)'替换't.join()'。您的主线程会每秒醒来检查一次信号。 – roippi 2014-09-05 01:34:51
更多阅读:http://snakesthatbite.blogspot.com/2010/09/cpython-threading-interrupting.html – roippi 2014-09-05 01:37:25