Python 守护线程
有时需要在后台执行任务。守护线程是用于后台任务的一种特殊类型的线程,称为 守护线程 。换句话说,守护线程在后台执行任务。
值得注意的是,守护线程执行的是非关键任务,尽管这些任务对应用程序可能有用,但如果它们失败或在操作过程中被取消,不会对它造成影响。
此外,守护线程无法控制其何时被终止。一旦所有的非守护线程完成,程序将终止,即使此时仍有守护线程在运行。
这是守护线程和非守护线程之间的一个重要区别。只有守护线程在运行时,进程才会退出;而如果至少有一个非守护线程在运行,进程将无法退出。
守护线程 | 非守护线程 |
---|---|
如果只有守护线程在运行(或者没有线程在运行),进程将退出。 | 如果至少有一个非守护线程在运行,进程将不会退出。 |
创建守护线程
要创建守护线程,您需要将 daemon 属性设置为 True。
t1=threading.Thread(daemon=True)
如果创建一个没有任何参数的线程对象,也可以在调用start()方法之前将其守护属性设置为True。
t1=threading.Thread()
t1.daemon=True
示例
请看下面的示例:
from time import sleep
from threading import current_thread
from threading import Thread
# function to be executed in a new thread
def run():
# get the current thread
thread = current_thread()
# is it a daemon thread?
print(f'Daemon thread: {thread.daemon}')
# create a new thread
thread = Thread(target=run, daemon=True)
# start the new thread
thread.start()
# block for a 0.5 sec for daemon thread to run
sleep(0.5)
它将产生以下 输出 −
Daemon thread: True
守护线程可以执行支持程序中的非守护线程的任务。例如 –
- 在后台创建一个存储日志信息的文件。
-
在后台执行网络爬虫。
-
在后台自动将数据保存到数据库中。
示例
如果运行中的线程被配置为守护线程,则会引发RuntimeError。请参考以下示例:
from time import sleep
from threading import current_thread
from threading import Thread
# function to be executed in a new thread
def run():
# get the current thread
thread = current_thread()
# is it a daemon thread?
print(f'Daemon thread: {thread.daemon}')
thread.daemon = True
# create a new thread
thread = Thread(target=run)
# start the new thread
thread.start()
# block for a 0.5 sec for daemon thread to run
sleep(0.5)
它将产生以下输出 –
Exception in thread Thread-1 (run):
Traceback (most recent call last):
. . . .
. . . .
thread.daemon = True
^^^^^^^^^^^^^
File "C:\Python311\Lib\threading.py", line 1219, in daemon
raise RuntimeError("cannot set daemon status of active thread")
RuntimeError: cannot set daemon status of active thread