Python线程守护案例如何设置守护线程

wen python案例 25

本文目录导读:

Python线程守护案例如何设置守护线程

  1. 使用 threading.Thread 设置守护线程
  2. 守护线程 vs 非守护线程示例
  3. 使用 Timer 创建守护线程
  4. 使用自定义线程类
  5. 实际应用场景:后台监控
  6. 注意事项

在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("主线程结束")
# 守护线程会自动终止

注意事项

  1. 守护线程不能持有资源:守护线程中不应包含需要正确关闭的资源(如文件、网络连接等)
  2. 设置时机:必须在 start() 之前设置 daemon 属性
  3. 线程启动后无法改变:线程启动后修改 daemon 属性会引发异常
# 错误示例
thread = threading.Thread(target=worker)
thread.start()
thread.daemon = True  # 这行会引发 RuntimeError
  1. 退出处理:守护线程不会执行 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("主线程结束")

守护线程通常用于后台任务、监控、日志记录等不需要精确关闭的场景。

抱歉,评论功能暂时关闭!