Python3:谈谈python的GIL、多线程、多进程

版权声明:转载 或者复制请标注来源 https://blog.csdn.net/qq_34979346/article/details/84026677

本文只是适合初认识多线程的小伙伴,里面的概念和原理一定要搞清楚,
不然以后设计多线程,多进程会出很大的错.
GIL的全称是Global Interpreter Lock(全局解释器锁),来源是python设计之初的考虑,为了数据安全所做的决定。

GIL 的特点:

  1. Python在多线程下,每个线程的执行方式为:
    1.获取GIL
    2.执行代码直到sleep或者是python虚拟机将其挂起。
    3.释放GIL (释放的条件,我下边再解释)
  2. 一个CPU只能执行一个线程 ,例如一个CPU 有三个线程 ,首先线程A执行 ,然后
    线程A达到释放条件进行释放GIL,线程B 和线程C 进行竞争GIL ,谁抢到GIL ,继续执行.
  3. 一个进程里有多线程,但只有一个GIL 锁,不同的进程GIL 锁互不干扰,
  4. 单个CPU多线程比多核多线程更快解释如下:
    (单核内线程之间切换可以几乎达到无缝连接,
    但是在多核情况下一个线程 A释放GIL 锁,其他CPU上的线程都会进行竞争,
    但是有可能线程A 又抢到这个锁,
    致其他几个CPU上被唤醒后的线程会醒着等待到切换时间后又进入待调度状态,
    这样会造成线程颠簸(thrashing),导致效率更低.
  5. 多核CPU和C 语言相比,python的多线程效率并不高.解释如下:
    1.释放GIL,和切换线程 需要消耗资源
    2.一个进程只能运行一个线程 (拿到GIL的线程才能执行)

GIL 的释放条件

  1. 使用计时器(执行时间达到阈值后,当前线程释放GIL),这样对CPU密集型程序更加友好,但依然没有解决GIL导致的同 一时间只能执行一个线程的问题,所以效率依然不尽如人意。
  2. IO操作 ,这个特性是优于其他语言的,
    当有IO 操作,GIL 会释放给其他的线程,避免输入操作浪费的时间.

“python下想要充分利用多核CPU,就用多进程”,原因是什么呢?

    先解释下并发和并行的区别,这是我们群给举的例子很形象,借来用用 :
   **你在听音乐看电影并发的时候, cpu是放一下音乐停下 再放电影来回切换,
   切的很快你感觉不到, 实际上并没有同时进行 而并行是两个同时进行的.一遍看电影也放着音乐**

根据GIL 的特性:

  1. 每个CPU 只能运行一个线程
  2. 每个进程只能一个GIL,并且GIL 之间互不干扰
    所以把进程都放在各自的CPU ,由于GIL 不干扰,就可以达到并行的操作.

所以我们能够得出结论:多核下,想做并行提升效率,比较通用的方法是使用多进程,能够有效提高执行效率

(其实还可以在多线程的时候,线程里的代码用c来写,Python调用,完美解决这个问题)

有写错的地方和好的建议 ,请评论,谢谢 你们的浏览

猜你喜欢

转载自blog.csdn.net/qq_34979346/article/details/84026677