在阅读Python处理并发的系列文章前,正确区分 进程/线程、并行/并发、阻塞/非阻塞、同步/异步 概念非常重要,是学习本部分内容的基础,也是面试中经常会被问到的内容。
一. 概念区分
1.1 进程和线程
一个正在运行的程序在操作系统中被视为一个进程,进程可以包括一个或多个线程。其中,线程是操作系统分配处理器时间片的最小单位。进程间是相互独立的,一个进程无法访问另一个进程的数据,一个进程的失败也不影响其他进程的运行;进程间通信需要依赖管道、队列、信号量等技术。
线程是进程中的基本执行单元,是操作系统分配CPU时间的基本单位,一个进程可以包含多个线程,多个线程共享主线程的资源,在进程开始执行的第一个线程被视为主线程。
进程和线程在使用时需要注意的地方:
- python多线程适合做io密集型程序,因为当一个线程遇到I/O操作时,将释放GIL(全局解释器锁),因此效率更高。如果是计算密集型程序,python中单线程因为没有线程切换的延时,效率将高于多线程。
- 对于计算密集型程序,一般使用多进程,多进程可以发挥多核cpu。计算密集型程序来说,多进程效率 > 单线程 > 多线程。
- GIL在较长一段时间内将会继续存在,但是会不断对其进行改进;不过可以使用multiprocessing替代Thread,或者使用协程,协程适合IO密集型,只用单核。
- IO密集型:涉及到网络、磁盘IO的任务都是IO密集型任务,这类任务的特点是CPU消耗很少,任务的大部分时间都在