本文目录导读:

在Python中,设置守护线程(Daemon Thread)有以下几种方式:
使用 threading.Thread 设置守护线程
在创建线程时设置
import threading
import time
def worker():
"""工作线程函数"""
for i in range(5):
print(f"工作线程正在执行: {i}")
time.sleep(1)
print("工作线程结束")
# 创建守护线程
daemon_thread = threading.Thread(target=worker, daemon=True)
daemon_thread.start()
# 主线程继续执行
print("主线程正在运行")
time.sleep(2)
print("主线程结束")
创建后设置
import threading
import time
def worker():
"""工作线程函数"""
for i in range(5):
print(f"工作线程正在执行: {i}")
time.sleep(1)
print("工作线程结束")
# 创建线程
daemon_thread = threading.Thread(target=worker)
# 设置为守护线程
daemon_thread.daemon = True
daemon_thread.start()
print("主线程正在运行")
time.sleep(2)
print("主线程结束")
守护线程 vs 非守护线程示例
import threading
import time
def non_daemon_worker():
"""非守护线程函数"""
for i in range(5):
print(f"非守护线程: {i}")
time.sleep(1)
print("非守护线程完成")
def daemon_worker():
"""守护线程函数"""
for i in range(5):
print(f"守护线程: {i}")
time.sleep(1)
print("守护线程完成") # 这行可能不会执行
# 创建非守护线程
non_daemon = threading.Thread(target=non_daemon_worker)
# 创建守护线程
daemon = threading.Thread(target=daemon_worker, daemon=True)
# 启动线程
non_daemon.start()
daemon.start()
# 主线程等待非守护线程完成
non_daemon.join()
print("主线程结束")
# 注意:守护线程会在主线程结束时被强制终止
使用 Timer 创建守护线程
import threading
import time
def delayed_task():
"""延迟执行的任务"""
print("延迟任务执行")
# 创建定时器(默认不是守护线程)
timer = threading.Timer(3.0, delayed_task)
timer.daemon = True # 设置为守护线程
timer.start()
print("主线程继续执行")
time.sleep(1)
print("主线程结束")
使用自定义线程类
import threading
import time
class DaemonThread(threading.Thread):
def __init__(self):
super().__init__()
self.daemon = True # 在初始化时设置
def run(self):
for i in range(5):
print(f"自定义守护线程: {i}")
time.sleep(1)
print("自定义守护线程完成")
# 创建并启动守护线程
daemon = DaemonThread()
daemon.start()
print("主线程正在运行")
time.sleep(2)
print("主线程结束")
实际应用场景:后台监控
import threading
import time
import random
class BackgroundMonitor:
"""后台监控守护线程"""
def __init__(self):
self.running = True
self.monitor_thread = threading.Thread(target=self._monitor, daemon=True)
def _monitor(self):
while self.running:
# 模拟监控任务
cpu_usage = random.randint(0, 100)
print(f"CPU使用率: {cpu_usage}%")
time.sleep(2)
print("监控线程结束")
def start(self):
self.monitor_thread.start()
def stop(self):
self.running = False
# 使用示例
monitor = BackgroundMonitor()
monitor.start()
# 主线程执行其他任务
for i in range(3):
print(f"主线程执行任务: {i}")
time.sleep(1)
print("主线程结束")
# 守护线程会自动终止
注意事项
- 守护线程不能持有资源:守护线程中不应包含需要正确关闭的资源(如文件、网络连接等)
- 设置时机:必须在
start()之前设置daemon属性 - 线程启动后无法改变:线程启动后修改
daemon属性会引发异常
# 错误示例 thread = threading.Thread(target=worker) thread.start() thread.daemon = True # 这行会引发 RuntimeError
- 退出处理:守护线程不会执行
finally块
import threading
import time
def daemon_with_cleanup():
try:
while True:
print("守护线程运行中")
time.sleep(1)
finally:
print("清理操作") # 可能不会执行
# 守护线程的finally块可能不会执行
d = threading.Thread(target=daemon_with_cleanup, daemon=True)
d.start()
time.sleep(2)
print("主线程结束")
守护线程通常用于后台任务、监控、日志记录等不需要精确关闭的场景。