1、python中的并发编程
- 多线程:模块threading,单核cpu,多任务
- 多进程:模块multiprocessing,多核cpu,真正的并行执行
- 异步IO:模块asyncio,在单线程但是cpu和io同时执行
使用Lock对资源加锁,防止访问冲突
使用Queue实现多进程/线程之间的通信
使用线程池/进程池
使用模块subprocess启动外部程序的进程
2、三种并发方式
2.1、cpu密集型和io密集型
- cpu密集型:程序运行的速率受限于cpu
如:压缩解压、加密解密 - io密集型:程序运行的速率受限于io
如:读写内存、爬取数据
2.2、进程、线程、协程
一个进程中可启动多个线程,一个线程中可启动多个协程
- 进程process(multiprocessing)
优点:可利用多核cpu并行计算
缺点:占用资源多,并发数量比线程少
适用于:cpu密集型计算 - 线程thread(threading)
优点:相比进程,更轻量,占用资源少
缺点:不能利用多cpu(GIL),并发数量有限,占用内存资源
适用于:IO密集型计算,同时运行的数目不多 - 协程coroutine(asyncio)
优点:内存开销小、支持很大的并发数量
缺点:有些库不支持、代码复杂
适用于:IO密集型计算,需要启动大量的任务
3、GIL
全局解释性锁GIL(Global interpreter lock)
为了解决多线程之间数据完整性和状态同步的问题
它的机制是:任何时刻只能由一个线程在执行,即使在多核cpu上
3.1、python运行慢的两大原因
- python是边解释边执行
- GIL,无法利用多核cpu并发执行
3.2、如何规避
- 在IO(读、写、发送、接收等)期间,线程会释放GIL,实现cpu和io并行
- 使用多进程实现并行
参考:【2021最新版】Python 并发编程实战
原作者:蚂蚁学Python