多任务
进程和线程的对比
关系对比
- 线程是依赖在进程里面的,没有进程就没有线程。
- 一个进程默认提供一条线程,进程可以创建多个线程。
区别对比
- 进程之间不能共享全局变量。
- 线程之间共享全局变量,但是要注意资源竞争的问题,解决办法:互斥锁或者线程同步。
- 创建进程的资源开销比创建线程的资源开销要大。
- 进程是操作系统资源分配的基本单位,线程是
CPU
调度的基本单位。 - 线程不能独立执行,必须依存在进程中。
- 多进程开发比单进程开发稳定性强。
优劣对比
进程优缺点:
- 优点:可以用多核
- 缺点:资源开销大
线程优缺点:
- 优点:资源开销小
- 缺点:不能使用多核
GIL
- 定义:全局解释器锁(解释器:
IPython
、CPython
、PyPython
等)
为什么线程不能使用多核?
- 就是因为
GIL
,GIL
保证同一时间,只有一个线程使用CPU
。 GIL
不是Python
的特性,只是CPython
解释器的问题。历史遗留问题。
CIL锁什么时候释放?
- 在当前线程执行超时后会自动释放;
- 在当前线程执行阻塞操作时会自动释放(
input
,io
/输入输出) - 在当前执行完成时会释放
GIL的弊端
GIL
对计算密集型的程序会产生影响。因为计算密集型,需要占用资源。GIL
的存在相当于始终在单线程运算,自然就慢了。IO
密集型影响不大的原因在于IO
、input/output
,这两个词就表明程序的瓶颈在于输入所耗费的时间,线程大部分时间按在等待,所以它们是多个一起等(多线程)还是单个等(单线程)无所谓。
解决方案
- 更换解释器;
- 改为进程替代多线程;
- 子线程使用
C
语言实现(绕过GIL
,也体现了Python
的胶水性,可以调用其它语言)。
重点:
CPU
密集型不适合多线程。I/O
密集型适合多线程(GIL
锁会释放)。