文章目录
- 1.进程与线程
- 2.多进程与多线程
- 2.1 什么是CPU密集型计算、IO密集型计算?
- 2.2 多线程、多进程、多协程的对比
- 2.3 怎样根据任务选择对应的技术?
- 3.全局解释器锁GIL
- 3.1 Python慢的两大原因
- 3.2 GIL是什么
- 3.3 为什么有GIL这个东西
- 3.4 怎样规避GIL带来的限制
1.进程与线程
- 进程是操作系统分配资源的最小单元, 线程是操作系统调度的最小单元。
- 一个应用程序至少包括1个进程,而1个进程包括1个或多个线程,线程的尺度更小。
- 每个进程在执行过程中拥有独立的内存单元,而一个线程的多个线程在执行过程中共享内存。
关于进程与线程阮一峰有一篇博客给出了比较形象的解释:进程与线程的一个简单解释
在Python对并发编程的支持如下:
- 多线程:threading , 利用CPU和IO可以同时执行的原理,让CPU不会干巴巴等待IO完成
- 多进程:multiprocess,利用多核CPU的能力,真正的并行执行任务
- 异步IO:asyncio,在单线程利用CPU和IO同时执行的原理,实现函数异步执行
- 使用Lock对资源加锁,防止冲突访问
- 使用Queue实现对不同线程/进程之间的数据通信,实现生产者-消费者模式
- 使用线程池Pool/进程池Pool,简化线程/进程的任务提交、等待结果、获取结果
- 使用subprocess启动外部程序的进程,并进行输入输出交互,实现交互式的进程通信
2.多进程与多线程
2.1 什么是CPU密集型计算、IO密集型计算?
CPU密集型(CPU-bound):也叫计算密集型,是指I/O在很短时间内可以完成‘,CPU需要大量的计算和处理,特点是CPU占用率相当高。例如:压缩解压缩、加密解密、正则表达式搜索
I/O密集型(I/O bound):指系统运作大部分的状况是CPU在等I/O(硬盘、内存)的读/写操作,CPU占用率较低。例如:文件处理程序、网络爬虫程序、读写数据库程序
2.2 多线程、多进程、多协程的对比
一个进程可以启动N个线程,一个线程可以启动N个协程
- 多进程 Process(multiprocessing)
优点:可以利用多核CPU并行运算
缺点:占用资源最多,可启动数目比线程少
适用于:CPU密集型计算
- 多线程Thread(threading)
优点:相比进程,更轻量级,占用资源少
缺点:(1)相比进程:多线程只能并发执行,不能利用多CPU(GIL)
(2)相比协程:启动数目有限,占用内存资源,有线程切换开销
适用于:IO密集型计算、同时运行的任务要求不多
- 多协程Coroutine(asyncio)
优点:内存开销最少、启动协程数量最多
缺点:支持的库有限制(aiohttp vs requests)、代码实现复杂
适用于:IO密集型运算、需要超多任务运行、但有现成库支持
2.3 怎样根据任务选择对应的技术?
首先如果是CPU密集型,选择使用多进程mutiprocessing,其次如果是IO密集型要看以下条件:(1)需要超多任务量(2)有现成协程库支持(3)协程实现的复杂度可接受。如果以上三个条件满足则使用多协程,否则使用多线程。
3.全局解释器锁GIL
Python被吐槽慢的头号嫌疑犯
3.1 Python慢的两大原因
原因一:Python是动态类型语言,边解释边执行
原因二:GIL的存在,无法利用多核CPU并行执行
3.2 GIL是什么
全名:全局解释器锁(Global Interpreter Lock)
是计算机程序设计语言解释器用于同步线程的一种机制,它使得任何时刻仅有一个线程在执行
即便在多核心处理器上,使用GIL的解释器也只允许同一时间执行一个线程
由于GIL的存在,即使电脑有多核CPU,单个时刻也只能使用一个,相比并发加速的C++/JAVA所以慢
3.3 为什么有GIL这个东西
简而言之:Python设计初期,为了规避并发带来的问题引入GIL,现在想去除却去不掉了。
为了解决多线程之间数据完整性和状态同步的问题
GIL的好处:简化了Python对共享资源的管理
3.4 怎样规避GIL带来的限制
1.多线程threading机制依然是有用的,用于IO密集型计算
因为在IO期间,线程会释放GIL,实现CPU和IO的并行,因此多线程用于IO密集型计算依然可以大幅提升速度
但是多线程应用于CPU密集型计算时,只会拖慢速度
2.使用multiprocessing的多进程机制实现并行计算,利用多核CPU优势
CPU和IO的并行,因此多线程用于IO密集型计算依然可以大幅提升速度
但是多线程应用于CPU密集型计算时,只会拖慢速度
参考资料:
https://zhuanlan.zhihu.com/p/46368084https://www.bilibili.com/video/BV1bK411A7tV?p=1