本文目录导读:

在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("主线程结束")
守护线程通常用于后台任务、监控、日志记录等不需要精确关闭的场景。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播