Python - 守护线程


有时,需要在后台执行任务。一种特殊类型的线程用于后台任务,称为守护线程。换句话说,守护线程在后台执行任务。

可能会注意到,守护线程执行此类非关键任务,尽管这些任务可能对应用程序有用,但如果它们在操作过程中失败或被取消,则不会妨碍应用程序。

此外,守护线程无法控制它何时终止。一旦所有非守护线程完成,程序就会终止,即使当时还有守护线程仍在运行。

这是守护线程和非守护线程之间的主要区别。如果只有守护线程正在运行,则该进程将退出,而如果至少有一个非守护线程正在运行,则该进程将无法退出。

守护进程 非守护进程
如果只有守护线程正在运行(或者没有线程正在运行),进程将退出。 如果至少有一个非守护线程正在运行,则进程不会退出。

创建守护线程

要创建守护线程,需要将daemon属性设置为 True。

t1=threading.Thread(daemon=True)

如果创建的线程对象没有任何参数,则在调用 start() 方法之前,也可以将其 daemon 属性设置为 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

守护线程可以执行程序中支持非守护线程的执行任务。例如 -

  • 创建一个文件,用于在后台存储Log信息。

  • 在后台执行网页抓取。

  • 在后台自动将数据保存到数据库中。

例子

如果正在运行的线程被配置为守护程序,则会引发运行时错误。看一下下面的例子 -

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