python GIL与多线程 GIL: Global Interpreter Lock(全局解释器锁),python虚拟机一级的互斥机制,用来保护资源的互斥访问,尤其是python对象的引用计数。 python代码执行
获得GIL 执行代码直到被阻塞或N条指令执行之后(py3:超时时间)被python 虚拟机调度 释放GIL 何时挂起当前线程:被阻塞或N条指令执行之后(py3:超时时间15ms) 如何选择等待的线程进行调度:由底层操作系统决定 python多线程机制是在GIL基础上实现的
python的多线程机制建立在操作系统的原生线程的基础之上
Thread safe in python Python线程安全与传统的java、c有很大不同,python的很多操作都是原子的,例如sort函数本身是原子操作,不会被其他线程看到排序一半的list;而有一些操作不是原子的,例如+=
n=0 def add(): global n n += 1 import dis #将python byte code转为助记符号 dis.dis(add) 3 0 LOAD_GLOBAL 0 (n) 3 LOAD_CONST 1 (1) 6 INPLACE_ADD 7 STORE_GLOBAL 0 (n) 10 LOAD_CONST 0 (None) 13 RETURN_VALUE 操作步骤为:
加载n到栈 加载常量n到栈 将两者相加 将结果付给n 由于操作不是原子的,python解释器可能在某一步被抢占,造成不一致的情况,执行以下代码,将不一定会得到100