GIL锁

GIL

在非python环境中,单核情况下,同时只能有一个任务执行。多核时可以支持多个线程同时执行。但是在python中,无论有多少核,同时只能执行一个线程。究其原因,这就是由于GIL的存在导致的。

GIL的全称是Global Interpreter Lock(全局解释器锁),来源是python设计之初的考虑,为了数据安全所做的决定。某个线程想要执行,必须先拿到GIL,我们可以把GIL看作是“通行证”,并且在一个python进程中,GIL只有一个。拿不到通行证的线程,就不允许进入CPU执行。GIL只在cpython中才有,因为cpython调用的是c语言的原生线程,所以他不能直接操作cpu,只能利用GIL保证同一时间只能有一个线程拿到数据。而在pypy和jpython中是没有GIL的。

Python多线程的工作过程:

python在使用多线程的时候,调用的是c语言的原生线程。

    1. 拿到公共数据
    2. 申请gil
    3. python解释器调用os原生线程
    4. os操作cpu执行运算
    5. 当该线程执行时间到后,无论运算是否已经执行完,gil都被要求释放
    6. 进而由其他进程重复上面的过程
    7. 等其他进程执行完后,又会切换到之前的线程(从他记录的上下文继续执行)
      整个过程是每个线程执行自己的运算,当执行时间到就进行切换(context switch)

 

posted @ 2019-07-01 13:53  Django_gege  阅读(221)  评论(0编辑  收藏  举报