我无法弄清楚为什么非守护程序线程(daemon thread description)在控制线程中断后仍然运行的根本原因。也许这不是特定的python ......
我期待这样的行为:当我中断控制线程时,生成我的程序的每个其他线程也应该关闭。
但是如果一个线程执行阻塞操作(例如I / O操作),那么该线程在控制线程中断后仍然运行。
Python文档说:
如果您希望线程正常停止,请使它们成为非守护进程并使用合适的信令机制,例如事件。
没关系 - 我们可以通过事件,信号等与线程进行通信,使用select()
进行非阻塞此类操作,并对循环中的事件条件做出反应。
但我想知道为什么事情会这样发生。
更新 我认为这是常见的问题,代码片段在这里并不是必需的,但这里是:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import threading
import time
def func_with_blocking_operation():
time.sleep(5)
threading.Thread(target=func_with_blocking_operation).start()
此处通过按下控制终端中的Ctrl+C
来中断控制线程(SIGINT
信号被发送到控制线程),程序仍在运行,而休眠功能未退出。也许是因为Python中默认join()
的非守护程序线程?
由于