Python GIL(Global Interpreter Lock)

一.全局解释器锁

 

'''
1 GIL:全局解释器锁
    GIL本质就是一把互斥锁,是加在解释器身上的,
    同一个进程内的所有线程都需要先抢到GIL锁,才能执行解释器代码

2、GIL的优缺点:
    优点:
        保证Cpython解释器内存管理的线程安全

    缺点:
        同一进程内所有的线程同一时刻只能有一个执行,
        也就说Cpython解释器的多线程无法实现并行

'''

from threading import Thread,current_thread
import time

def task():
    print('%s is running' %current_thread().name)#查看线程名
    time.sleep(3)
    print('%s is done' %current_thread().name)

if __name__ == '__main__':
    t1=Thread(target=task)
    t2=Thread(target=task)
    t3=Thread(target=task)
    t1.start()
    t2.start()
    t3.start()

二.GIL(全局解释器锁)

2.1什么是GIL?

全局解释器锁,本质就是一把互斥锁,是加到解释器身上的,每一个python进程内都有这么一把锁

2.2有了GIL会对单进程下的多个线程造成什么影响?

多线程要想执行,首先需要争抢GIL,对所有待执行的线程来说,GIL就相当于执行权限,
同一时刻只有一个线程争抢成功,即单进程下的多个线程同一时刻只有一个在运行
意味着单进程下的多线程没有并行的效果,但是有并发的效果

ps:分散于不同进程内的线程不会去争抢同一把GIL,只有同一个进程的多个线程才争抢同一把GIL

2.3为什么要有GIL?

Cpython解释器的内存管理机制不是线程安全的

2.4GIL与自定义互斥锁的异同,多个线程争抢GIL与自定义互斥锁的过程分析

相同:
    都是互斥锁
不同点:
    GIL是加到解释器上的,作用于全局
    自定义互斥锁作用于局部

    单进程内的所有线程都会去抢GIL
    单进程内的只有一部分线程会去抢自定义的互斥锁

2.5什么时候用python的多线程,什么时候用多进程,为什么?

单进程下的多个线程是无法并行,无法并行意味着不能利用多核优势

cpu干的计算的活,多个cpu意味提升了计算性能,
cpu是无法做IO操作,多个cpu在IO操作面前毫无用处

当我们的程序是IO密集型的情况下,多核对性能的提升微不足道,此时可以使用python的多线程
当我们的程序是计算密集型的情况下,一定要用上多核优势,此时可以使用python的多进程

三.

pass

四.

pass

posted @ 2019-01-07 17:45  王苗鲁  阅读(145)  评论(0)    收藏  举报