在Python并发编程的演进中进程、线程、生成器、协程是绕不开的核心概念。进程是资源隔离的最小单位线程是CPU调度的基本单元而生成器是协程的基础协程则是轻量级的用户态并发方案。本文将通过5个实战代码文件从生成器推导式到协程实战逐步拆解核心逻辑并对比进程、线程的差异帮你彻底掌握高效并发编程。一、核心概念前置进程 vs 线程 vs 协程先理清三者的本质区别这是理解后续代码的基础特性进程线程协程资源占用高独立内存空间中共享进程内存极低共享线程栈切换开销极大操作系统调度内核态较大操作系统调度内核态极小用户态自行切换并发能力多核并行适合CPU密集型受GIL限制Python中无真正并行单线程并发适合IO密集型实现难度中中低基于生成器/asyncio核心依赖os.fork/multiprocessingthreading生成器/yield/asyncio核心结论Python中线程受GIL全局解释器锁限制无法实现多核并行协程不依赖操作系统调度在单线程内完成任务切换是IO密集型场景爬虫、文件读写、网络请求的最优解。而生成器是协程的底层基石。二、实战代码从生成器到协程01_回顾推导式.py推导式是Python的语法糖支持快速创建列表、字典、集合也是理解生成器推导式的基础。# 1. 列表推导式立即创建所有元素占用内存大list_comp[iforiinrange(5)]print(列表推导式,list_comp)# 输出[0,1,2,3,4]# 2. 字典推导式dict_comp{i:i*2foriinrange(3)}print(字典推导式,dict_comp)# 输出{0:0,1:2,2:4}# 3. 集合推导式set_comp{iforiinrange(3)}print(集合推导式,set_comp)# 输出{0,1,2}核心特点推导式会立即生成所有数据适合数据量小的场景数据量过大时会占用大量内存。02_生成器推导式.py生成器推导式是惰性求值的迭代器语法和列表推导式一致仅将[]改为()不立即生成数据节省内存。# 生成器推导式惰性生成元素内存占用极低gen(iforiinrange(5))print(生成器对象,gen)# 输出generator object genexpr at 0xxxx# 遍历生成器每次调用next()才生成一个元素print(next(gen))# 0print(next(gen))# 1# 循环遍历自动调用next()直到无元素fornumingen:print(循环遍历,num)# 2,3,4核心特点惰性求值用到才生成不占用额外内存只能遍历一次遍历完后自动销毁是Python中轻量级的迭代器实现。03_yield生成器.pyyield是生成器的核心关键字替代return让函数变成生成器函数支持暂停/恢复执行。# 定义生成器函数包含yield关键字defgenerator_func():yield1# 暂停返回1yield2# 暂停返回2yield3# 暂停返回3# 创建生成器对象gengenerator_func()print(生成器函数对象,gen)# generator object generator_func at 0xxxx# 手动获取元素print(next(gen))# 1print(next(gen))# 2# 循环获取剩余元素fornumingen:print(剩余元素,num)# 3核心原理调用next()时函数执行到yield暂停返回当前值再次调用next()从暂停位置继续执行直到下一个yield无yield可执行时抛出StopIteration异常。进阶带参数的生成器send方法生成器不仅能产出值还能接收外部传入的值这是协程的基础defparam_gen():whileTrue:# 接收外部send的值赋值给xxyieldprint(f接收到的值{x})genparam_gen()next(gen)# 预激活生成器gen.send(10)# 发送10输出接收到的值10gen.send(20)# 发送20输出接收到的值2004_协程的应用.py协程是用户态的轻量级线程基于生成器的yield暂停/恢复特性实现无需操作系统调度单线程内实现并发。Python3.5推荐使用async/await语法底层仍依赖生成器实战如下importasyncioimporttime# 定义协程函数async关键字修饰asyncdeftask(name,delay):print(f协程任务{name}开始耗时{delay}秒)# await暂停当前协程执行其他协程实现非阻塞等待awaitasyncio.sleep(delay)print(f协程任务{name}完成)# 主协程调度多个协程asyncdefmain():# 创建协程任务列表tasks[asyncio.create_task(task(A,2)),asyncio.create_task(task(B,1)),]# 并发执行所有任务awaitasyncio.gather(*tasks)if__name____main__:starttime.time()# 运行协程asyncio.run(main())endtime.time()print(f总耗时{end-start:.2f}秒)运行结果协程任务A开始耗时2秒 协程任务B开始耗时1秒 协程任务B完成 协程任务A完成 总耗时2.01秒核心逻辑async定义协程函数不能直接执行需放入事件循环await遇到IO等待时自动切换到其他协程不阻塞线程两个任务总耗时≈最长任务耗时实现真正的并发。05_示例体验.py综合对比同步执行 vs 协程并发直观感受协程的效率提升。importasyncioimporttime# 同步函数阻塞执行defsync_task(name,delay):print(f同步任务{name}开始耗时{delay}秒)time.sleep(delay)print(f同步任务{name}完成)# 协程函数非阻塞并发asyncdefasync_task(name,delay):print(f协程任务{name}开始耗时{delay}秒)awaitasyncio.sleep(delay)print(f协程任务{name}完成)# 1. 同步执行测试print( 同步执行 )starttime.time()sync_task(A,2)sync_task(B,1)print(f同步总耗时{time.time()-start:.2f}秒\n)# 2. 协程并发测试print( 协程并发 )asyncdefmain():awaitasyncio.gather(async_task(A,2),async_task(B,1),)starttime.time()asyncio.run(main())print(f协程总耗时{time.time()-start:.2f}秒)运行结果 同步执行 同步任务A开始耗时2秒 同步任务A完成 同步任务B开始耗时1秒 同步任务B完成 同步总耗时3.01秒 协程并发 协程任务A开始耗时2秒 协程任务B开始耗时1秒 协程任务B完成 协程任务A完成 协程总耗时2.01秒核心结论同步执行总耗时所有任务耗时之和协程并发总耗时≈最长任务耗时效率提升显著。三、生成器与协程的核心关系生成器是协程的底层基础协程的暂停/恢复依赖生成器yield的特性生成器侧重数据生成逐个产出数据节省内存协程侧重任务并发在单线程内切换IO任务提升并发效率。四、适用场景总结进程CPU密集型任务大数据计算、视频编码利用多核线程IO密集型低并发场景受GIL限制效率一般生成器大数据量迭代读取大文件、海量数据生成协程高并发IO密集型场景爬虫、API接口、WebSocket、文件批量读写。总结本文通过5个实战代码从基础推导式过渡到生成器再基于生成器实现协程同时对比了进程、线程、协程的核心差异推导式是语法糖立即生成数据生成器推导式惰性求值节省内存yield是生成器核心支持暂停/恢复是协程的底层依赖协程基于用户态切换无操作系统开销是Python高并发IO的最优解进程/线程适合不同场景协程则是轻量级并发的终极选择。掌握生成器和协程能让你的Python代码在IO密集型场景下用极低的资源实现超高并发这也是Python进阶编程的必备技能。