当前位置: 首页 > news >正文

Python并行计算:2.Python多线程编程:threading模块详解与守护线程实战

Python多线程编程:threading模块详解与守护线程实战

一、threading模块核心功能

Python的threading模块是标准库中实现多线程编程的高级接口,提供线程创建、同步、通信等完整解决方案。相比底层_thread模块,其优势在于:

  • 面向对象设计,支持线程对象管理
  • 丰富的同步原语(锁、信号量、条件变量等)
  • 线程安全的数据结构(如Queue
  • 完善的线程生命周期管理
二、线程创建的两种方式
1. 函数式创建(推荐)
import threadingdef task(name, delay):for i in range(3):print(f"{name}执行第{i+1}次任务")time.sleep(delay)# 创建线程并传递参数
thread = threading.Thread(target=task,args=("Worker-1", 2),daemon=False  # 默认非守护线程
)
thread.start()  # 启动线程
thread.join()   # 等待线程结束
2. 继承式创建
class CustomThread(threading.Thread):def __init__(self, name, delay):super().__init__(name=name)self.delay = delaydef run(self):for i in range(3):print(f"{self.name}执行第{i+1}次任务")time.sleep(self.delay)# 创建并启动线程
custom_thread = CustomThread("Worker-2", 1.5)
custom_thread.start()
custom_thread.join()
三、线程查询与管理
1. 活跃线程监控
# 获取当前活跃线程列表
active_threads = threading.enumerate()
print(f"当前活跃线程数:{len(active_threads)}")# 实时监控线程创建
for i in range(3):thread = threading.Thread(target=task, args=(f"Thread-{i}", 1))thread.start()print(f"启动{thread.name}后活跃线程数:{threading.active_count()}")
2. 线程生命周期控制
  • start(): 启动线程(必须调用此方法而非直接执行run)
  • join(timeout): 等待线程结束,超时返回
  • is_alive(): 检查线程是否存活
3. 线程暂停/恢复模式
class PausableThread(threading.Thread):def __init__(self):super().__init__()self.pause_event = threading.Event()self.pause_event.set()  # 初始为运行状态def pause(self):self.pause_event.clear()def resume(self):self.pause_event.set()def run(self):while True:self.pause_event.wait()  # 阻塞直到恢复# 执行具体任务...
四、守护线程深度解析
1. 核心特性
  • 当所有非守护线程结束时,守护线程自动终止
  • 适合执行后台任务(日志记录、监控等)
  • 不能持有关键资源(如文件句柄)
2. 设置方式
# 方式一:构造函数设置
daemon_thread = threading.Thread(target=background_task,daemon=True  # 必须在线程启动前设置
)# 方式二:属性设置
thread = threading.Thread(target=task)
thread.daemon = True
thread.start()
3. 继承行为
  • 新建线程继承创建线程的守护属性
  • 主线程(非守护)创建的线程默认非守护
  • 守护线程创建的子线程自动继承守护属性
4. 典型应用场景
# 日志监控守护线程示例
class LogMonitor(threading.Thread):def __init__(self, log_file):super().__init__(daemon=True)self.log_file = log_filedef run(self):with open(self.log_file, 'r') as f:while True:line = f.readline()if not line:time.sleep(1)continue# 实时处理日志...# 启动监控
monitor = LogMonitor("app.log")
monitor.start()
五、最佳实践与注意事项
  1. 资源竞争处理
lock = threading.Lock()
shared_counter = 0def safe_increment():global shared_counterwith lock:  # 自动获取/释放锁shared_counter += 1
  1. 守护线程限制
  • 避免在守护线程执行:
    • 文件写入操作
    • 数据库事务
    • 关键计算任务
  1. 线程池优化(适用于大量短任务):
from concurrent.futures import ThreadPoolExecutorwith ThreadPoolExecutor(max_workers=5) as executor:futures = [executor.submit(task, i) for i in range(10)]for future in futures:print(future.result())
六、完整生命周期示例
import threading
import timeclass LifecycleDemo(threading.Thread):def __init__(self, name):super().__init__(name=name, daemon=False)self.start_time = time.time()def run(self):print(f"{self.name}启动,PID:{threading.get_ident()}")for i in range(3):print(f"{self.name}执行阶段{i+1}")time.sleep(1)print(f"{self.name}结束,运行时间:{time.time()-self.start_time:.2f}秒")# 创建并管理线程
main_thread = threading.current_thread()
print(f"主线程{main_thread.name}启动")worker = LifecycleDemo("Worker-X")
worker.start()# 等待子线程结束
worker.join(timeout=5)
print(f"所有任务完成,活跃线程数:{threading.active_count()}")

通过合理运用threading模块的线程创建、同步机制和守护线程特性,可以有效提升程序并发性能,同时需注意线程安全和资源管理,避免竞态条件和死锁问题。

http://www.xdnf.cn/news/164773.html

相关文章:

  • B3791 [信息与未来 2023] 电路布线
  • c++-模板
  • 2.4.5goweb项目上传到csdn的git仓库
  • 【量化交易笔记】17.多因子的线性回归模型策略
  • 提取office最强悍的软件
  • asammdf 库的文件操作和数据导出:高效管理 MDF 文件
  • 刚体运动 (位置向量 - 旋转矩阵) 笔记 1.1~1.3 (台大机器人学-林沛群)
  • 职场十二法则-马方
  • AnimateCC教学:元件旋转当中平移
  • 桥接模式(Bridge Pattern)详解
  • 从OpenAI收购实时数据引擎揭示AI数据库进化方向
  • ARM架构的微控制器总线矩阵仲裁策略
  • Java基础语法10分钟速成
  • JAVA:线程安全问题及解决方案
  • Centos7系统防火墙使用教程
  • 【JavaScript】自增和自减、逻辑运算符
  • 五年经验Java开发如何破局创业
  • L1-5 这是字符串题
  • # **DeepSeek 保姆级使用教程**
  • Redis数据结构SDS,IntSet,Dict
  • Java—— 五道算法水题
  • 强化学习基础
  • Python AI图像生成方案指南
  • Axure疑难杂症:全局变量典型应用及思考逻辑(玩转全局变量)
  • 剑指offer经典题目(六)
  • 做的一些题目的答案和自己的一些思考
  • LangChain 中的 Task(任务) 主要通过 生成器(Generator) 实现,而非传统的迭代器(Iterator)
  • Ardunio学习
  • 推论阶梯——AI与思维模型【81】
  • Redis 数据分片三大方案深度解析与 Java 实战