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

Python进阶【一】 :线程、进程与协程

🧩 一、核心概念

1. 并发 vs 并行

  • 并发(Concurrency):看似同时执行多个任务,实际快速切换。
  • 并行(Parallelism):真正同时执行多个任务(需多核支持)。

2. Python 解释器与 GIL

  • CPython:官方实现,使用 GIL 限制并行执行。
  • GIL(Global Interpreter Lock):同一时刻仅允许一个线程执行字节码,利于线程安全,但限制多核并行。
  • Jython / IronPython / PyPy:其他解释器(可能无 GIL),适用于特定平台或场景。

🧵 二、线程编程(threading 模块)

1. 线程基础概念

类型说明
主线程Python 程序启动后默认的执行线程。
子线程通过 threading.Thread() 创建的新线程。
守护线程程序退出时不等待其完成(后台任务),设置 daemon=True

2. 创建线程的两种方式

  • 实例化 Thread 类
import threadingdef task():print("线程任务")t = threading.Thread(target=task)
t.start()
  • 继承 Thread 类
class MyThread(threading.Thread):def run(self):print("子类线程任务")t = MyThread()
t.start()

3. 常用方法与属性

方法/属性说明
start()启动线程
join()阻塞等待线程结束
is_alive()判断线程是否存活
daemon是否为守护线程
name / ident获取线程名称 / 标识符
current_thread()返回当前线程对象

4. 线程同步机制

✅ Lock(互斥锁)
lock = threading.Lock()
with lock:# 线程安全操作
✅ RLock(可重入锁)

同一线程可重复获取,避免死锁。

✅ Condition(条件变量)

用于线程间条件通知。

cond = threading.Condition()def consumer():with cond:cond.wait()print("消费数据")def producer():with cond:cond.notify()
✅ Semaphore(信号量)

控制最大并发线程数。

sem = threading.Semaphore(3)
with sem:# 同时最多 3 个线程执行
✅ Event(事件)

用于线程通信。

event = threading.Event()event.set()   # 标志设为 True
event.wait()  # 等待直到标志为 True

5. 线程池(推荐)

from concurrent.futures import ThreadPoolExecutorwith ThreadPoolExecutor(max_workers=5) as pool:pool.submit(task)

🔄 三、进程编程(multiprocessing 模块)

1. 特点

特性描述
独立性每个进程有独立内存,崩溃不互相影响
支持并行不受 GIL 限制,可在多核 CPU 上并行执行
通信方式需使用 IPC(队列、管道、共享内存)
开销较大创建/销毁成本高,资源占用大

2. 创建进程

from multiprocessing import Processdef task():print("子进程任务")p = Process(target=task)
p.start()
p.join()

3. 进程间通信

  • 使用 QueuePipe 传递数据。
  • 使用 Manager().dict() 共享数据结构。

⚙️ 四、协程编程(asyncio 模块)

1. 特点

  • 非阻塞、单线程:通过事件循环管理大量 I/O 操作。
  • 节省资源:适合高并发网络编程(如爬虫、聊天服务等)。
  • 使用 async/await 语法实现异步流程控制。

2. 示例

import asyncioasync def task(n):print(f"任务{n}开始")await asyncio.sleep(1)print(f"任务{n}结束")async def main():await asyncio.gather(task(1), task(2))asyncio.run(main())

🚧 五、线程安全问题:共享数据与加锁

示例:线程不安全代码

count = 0
def inc():global countfor _ in range(100000):count += 1  # 非原子操作

使用锁解决:

lock = threading.Lock()def safe_inc():global countfor _ in range(100000):with lock:count += 1

🎯 六、各并发方式适用场景总结

场景类型优选方案说明
CPU 密集型多进程利用多核,规避 GIL
I/O 密集型多线程 / 协程异步执行阻塞操作,提升资源利用率
网络并发协程 (asyncio)万级并发连接,性能高
GUI 程序子线程处理耗时任务避免主线程阻塞 UI

📌 七、总结对比表

特性线程进程协程
是否受 GIL 限制是(但通常无影响)
内存占用极低
创建/销毁开销最小
通信方式共享内存(需加锁)IPC(队列、管道)共享对象/await
并行能力伪并行(受 GIL)真并行(多核)非并行,异步并发
推荐场景I/O密集CPU密集大量并发 I/O

📚 推荐阅读

  • Python 官方 threading 文档
  • asyncio 官方文档
  • 《流畅的Python》第18-20章:深入协程和并发
http://www.xdnf.cn/news/696745.html

相关文章:

  • Vite Vue3 配置 Composition API 自动导入与项目插件拆分
  • 输配电行业国产PLM转型方案:南通禛华电气的云PLM研发转型
  • rsync 如何通过参数加上端口号
  • 大观杂志大观杂志社大观编辑部2025年第4期目录
  • Java 并发编程通关秘籍:多线程基础 + 锁机制 + 工具类 + 性能优化
  • Appium+python自动化(七)- 认识Appium- 上
  • 【AI算法工程师面试指北】大模型微调中的灾难性遗忘该如何避免?
  • 多台电脑共用一个ip地址可以吗?会怎么样
  • Screen 连接远程服务器(Ubuntu)
  • docker中多个容器相互访问的端口问题
  • YOLOv8 模型部署到树莓派的完整指南
  • Golang | gRPC demo
  • C++23 <spanstream>:基于 std::span 的高效字符串流处理
  • 软件检测:确保品质关键步骤,企业该如何选择检测方式?
  • 王树森推荐系统公开课 排序05:排序模型的特征
  • 28、请求处理-【源码分析】-请求映射原理
  • 《仿盒马》app开发技术分享-- 确认订单页(业务逻辑)(端云一体)
  • 便携式遥测自跟踪天线
  • 大语言模型推理优化技术综述(The Art of LLM Inference)
  • Oracle基础知识(五)——ROWID ROWNUM
  • 前端开发定时,ES学习,java集合
  • 大数据学习笔记
  • 一种白平衡增益计算中白点权重计算简易实现方式
  • 【备忘】php命令行异步执行超长时间任务
  • Linux云计算训练营笔记day18(Python)
  • (25年5.28)ChatGPT Plus充值教程与实用指南:附国内外使用案例与模型排行
  • 【第2章 绘制】2.12 高级路径操作
  • MySQL 表内容的增删查改 -- CRUD操作,聚合函数,group by 子句
  • 英一真题阅读单词笔记 17年
  • 06.概念二:神经网络