python的GIL锁
进程:系统运行的一个程序,是系统分配资源的基本单位。 线程:是进程中执行运算的最小单位,是处理机调度的基本单位。 处理机:是计算机中存储程序和数据,并按照程序规定的步骤执行指令的部件。包括中央处理器、主存储器、I/O接口。 程序:程序是描述处理机完成某任务的指令序列。 指令:处理机能够解释、直接执行的信息单位。 计算机系统:处理机+外围设备。 并行:多个cpu同时执行多个任务,假设有两个程序,这两个程序在两个不同的cpu上同时运行。 并发:单个cpu交替执行多个任务,假设有两个程序,这两个在该cpu上交替进行运行,而不是同时运行,只是由于执行的时间太快,让人误以为是在“同时进行”。执行的先后取决于对时间片资源的竞争。其中两种并发关系是同步和互斥。 同步:不是指同时进行,指线程之间按一定顺序进行运行,当前一个线程结束时,下一个线程才能够运行。 异步:线程不可以同时进行运行。 (1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程是操作系统可识别的最小执行和调度单位。 ? 用C语言写的python解释器存在GIL,python语言本身是不存在GIL的 。GIL是cpython的全局解释器锁,而且只有一个。当同一进程中存在多个线程运行,一个线程在运行python程序的时候会占用Python解释器(即获得GIL),使该进程内的其他线程无法运行,等该线程运行完成后,其他线程才能运行。即使是在多核况下,也只能发挥单核的性能。 什么时候释放锁? (1)对于i/o的线程,是不需要cpu的,也就是cpu空闲的时候。 (2)对于cpu密集型的线程,cpu会一直被占用进行计算,此时有一个指令计数器,当一个线程执行了一定数量的指令时(100),GIL就会被释放,释放后多个线程对GIL进行竞争。 解决GIL的方法? (1)在使用多线程时,使用其他语言; (2)换一种Python解释器; (3)使用多进程; GIL和互斥锁有什么区别? 互斥锁:修改数据时有序的更改,不产生数据的混乱。 ?一张图解决,注意:互斥不是线程之间按一定顺序执行,而是在同一时间只能执行一个线程。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |