当使用线程和信号处理程序时,需要两次调用exit()来退出。

问题描述 投票:0回答:1

我偶然发现了一段代码,这段代码有点古怪,我期待着当程序发出信号时,会有 exit() 应提高 SystemExit 一次,并导致程序退出,然而在这种情况下,当主线程阻塞在 th.join()జజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజ exit() 语句需要调用两次,程序才能退出。

这并不是一个实际的工作,但我想知道到底是怎么回事。

import threading
import time
import signal


def task():
    while True:
        time.sleep(1)

def sig_handler(self, *_):
    # raise ValueError()
    exit()

def main():
    signal.signal(signal.SIGINT, sig_handler)
    th = threading.Thread(target=task)
    th.start()
    th.join()

if __name__ == "__main__":
    main()
python python-3.x signals python-multithreading
1个回答
0
投票

通常情况下,我们的主程序会隐式地等待,直到所有其他线程完成工作。使用守护进程线程对于那些可能没有一个简单的方法来中断线程或者让线程在工作中死去而不丢失或破坏数据的服务是有用的.要将一个线程设置为守护进程,它运行时不阻止主程序退出.使用setDaemon()方法。你的主函数将是。

def main():
    signal.signal(signal.SIGINT, sig_handler)
    th = threading.Thread(target=task)
    th.setDaemon(True)
    th.start()
    th.join()
© www.soinside.com 2019 - 2024. All rights reserved.