Python多线程:使用setDaemon设置后台线程详解

江岸
江岸
发布时间:2026-10-13 | 3人浏览过
原创

本文详解Python中Thread类的setDaemon方法,区分前台与后台线程在进程退出时的行为差异。通过MD5计算与打印示例,展示setDaemon(True)如何使后台线程随主线程退出而强制终止,以及setDaemon(False)默认等待机制,帮助开发者掌握后台服务线程的管理策略。

Python后台线程与前台线程的区别

在多线程编程中,线程的存在形式较为抽象。通过区分前台线程和后台线程,可以更直观地理解线程的执行顺序。对于复杂的多线程程序,还可以进一步通过设置线程优先级来优化调度。

后台线程与前台线程最直观的区别在于它们对主线程退出行为的响应方式。

1) 调用 setDaemon(True):当主线程结束时,后台线程会立即随机退出,不再等待其执行完毕。

2) 调用 setDaemon(False)(这是默认状态):当主线程结束时,如果前台线程尚未结束,主线程会等待所有前台线程执行完毕后再退出,这相当于在程序末尾自动调用了 join() 方法。

前台线程与后台线程实例演示

下面通过一个具体实例来演示这两种情况。

示例场景:主线程调用 giveures 函数计算字符串 s 的 MD5 摘要值,同时在 giveures 函数内部启动一个子线程,用于打印该字符串的内容。

1. 前台线程模式


import time
from hashlib import md5
from threading import Thread

def pmd(md):
  time.sleep(3) #使用sleep使得该线程比主线程晚结束
  print("backend recording:",md)


def giveures(s):
  md = md5(s.encode('utf-8'))
  res = md.digest()
  t = Thread(target=pmd,args=(s,))
  #t.setDaemon(True) 默认情况:t.setDaemon(False)
  t.start()
  return res

s = 'chrisyang'
res = giveures(s)
print(res)
exit()

运行结果如下:

b'h#\x86|\xa0\xeff\xc7u\xba\x18\xb2\xd2s\xf9\x9e' backend recording: chrisyang

从输出可以看出,第一行结果打印后,间隔约3秒才打印出第二行。这说明主线程在等待 pmd 线程执行结束后,进程才正式退出。

2. 后台线程模式


import time
from hashlib import md5
from threading import Thread

def pmd(md):
  time.sleep(3) #使用sleep使得该线程比主线程晚结束
  print("backend recording:",md)


def giveures(s):
  md = md5(s.encode('utf-8'))
  res = md.digest()
  t = Thread(target=pmd,args=(s,))
  t.setDaemon(True)
  t.start()
  return res

s = 'chrisyang'
res = giveures(s)
print(res)
exit()

运行结果如下:

b'h#\x86|\xa0\xeff\xc7u\xba\x18\xb2\xd2s\xf9\x9e'

由于 pmd 线程执行了 sleep 操作挂起一段时间,当主线程完成计算并退出时,pmd 线程尚未结束,因此被强制终止,导致其打印语句未执行。

后台线程的设计意义与总结

知识总结:

上述内容展示了前后台线程在进程退出时的外在行为差异。关于其内在逻辑,以下引用自 Stack Overflow 的一个精炼解释:

后台线程的主要职责是为整个主线程提供辅助服务,例如保持网络连接(发送 keep-alive 心跳包)或负责内存管理与垃圾回收(JVM 即采用此类机制)。因此,这些线程与实际提供应用核心服务的线程之间,在逻辑上形成了“前/后”的关系。一旦主线程退出,后台线程也就失去了存在的意义。

如果没有这种机制,在主线程完成后,开发者必须逐个检查后台线程的状态,并在主线程退出前手动关闭它们。有了前后台线程的区分,开发者只需关注前台线程的管理,在完成主要业务逻辑后即可直接退出,无需额外处理后台线程的关闭。

参考原文:

Daemon Threads Explanation

以上关于 Python 使用 Thread 的 setDaemon 启动后台线程的教程到此结束,希望能对大家有所帮助。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表