這應該是非常簡單的,我很驚訝,我一直無法找到已經在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