194 views
Python高级技巧

10.GIL及多任务总结

文章目录

GIL的概念


详细介绍参考网站:https://www.jianshu.com/p/756c505ab828

描述Python GIL的概念,以及它对Python多线程的影响
1. python语言和GIL没有关系,仅仅是由于历史原因在Cpython虚拟机,难以移除GIL
2. GIL:全局解释器锁。每个线程在执行的过程都需要先获取GIL,保证同一时刻只有一个线程可以执行代码
3. 线程释放GIL锁的情况:在IO操作等可能会引起阻塞的system call之前,可以暂时释放GIL,但在执行完毕后,必须重新获取GIL,Python3使用计时器
4. Python使用多进程是可以利用多核的CPU资源的
5. 多线程爬取比单线程性能有提升,因为遇到IO阻塞会自动释放GIL锁

如:
- 主线程死循环
while True:
    pass

- 2个线程死循环(如果是2核的CPU,每核只能使用到50%)
import threading
# 子线程死循环
def test():
    while True:
        pass
t1 = threading.Thread(target=test)
t1.start()

# 主线程死循环
while True:
    pass

- 2个进程死循环 (如果是2核的CPU,每核都能使用到100%)
import multiprocessing
def deapLoop():
    while True:
        pass

# 子进程死循环
p1 = multiprocessing.Process(target=deapLoop)
p1.start()

# 主进程死循环
while True:
    pass

线程、进程、协程多任务总结

1. 一些概念帮助理解:
- 一个运行的程序(代码)就是一个进程,没有运行的代码叫程序
- 进程是资源分配的单位
- 进程拥有自己独立的内存空间,所以进程间数据不共享,进程切换需要的资源很最大,效率很低,开销很大

- 线程是操作系统调度的单位
- 线程切换需要的资源一般,效率一般(当然了在不考虑GIL的情况下)

- 协程切换任务资源很小,效率高
- 多进程、多线程根据cpu核数不一样可能是并行的
- 协程是在一个线程中所以是并发


2. 多进程使用场景:

- 多进程适合在CPU 密集型操作(cpu 操作指令比较多,计算密集型,如科学计算,位数多的浮点运算)
- Python这样的脚本语言运行效率很低,完全不适合计算密集型任务。对于计算密集型任务,最好用C语言编写。

多线程使用场景:
- 多线程适合在IO 密集型操作(读写数据操作较多的,比如爬虫)
- 对于IO密集型任务,最合适的语言就是开发效率最高(代码量最少)的,脚本语言(如python)是首选,C语言最差。

协程使用场景:
- Python中的多线程是假的多线程,协程+线程=真的多线程

3. 线程与进程的关系:

- 线程是并发,进程是并行;

- 线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间
- 当进程退出时该进程所产生的线程都会被强制退出并清除。

- 线程可与属于同一进程的其它线程共享进程所拥有的全部资源,但是其本身基本上不拥有系统资源,
- 只拥有一点在运行中必不可少的信息(如程序计数器、一组寄存器和栈)。