【问题标题】:Need to call exit() twice to exit when working with thread and signal handler使用线程和信号处理程序时需要调用 exit() 两次退出
【发布时间】:2020-09-22 23:39:35
【问题描述】:

我偶然发现了一段有点奇怪的代码,我期待当程序发出信号时,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】:

    通常,我们的主程序会隐式等待,直到所有其他线程完成它们的工作。使用守护线程对于可能没有简单方法来中断线程或让线程在其工作过程中死亡而不会丢失或损坏数据的服务很有用。将线程设置为在不阻止主程序退出的情况下运行的守护进程。使用 setDaemon() 方法。您的主要职能是:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多