采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
老师没讲明白一个问题,为什么走了gil,还不能保证现成安全,还得自己加锁,那要他何用?
GIL 保证了同时间最多只能有一个线程执行字节码,它保证的是字节码层面的线程安全。但是多字节码操作无法保证对数据结构的访问是安全的。
我给举个例子。对于 a += 1,可以认为它有三步骤。分别是获取 a 的值,自增操作,最后保存回 a 变量。这个操作需要多个字节码操作,不是原子操作。(python 很多内置数据结构的操作都是原子的,比如直接赋值,这些是线程安全的)
load a
incr a
save a
假设 a=0,现在有两个线程A,B 在 执行,执行一个线程(A)的过程中有可能切换到另一个线程(B),时序图如下:
这张图基本就说明了问题,不知道看懂了咩?这里 期望的是2个线程应该是自增了两次,结果是2,但是这种情况下小概率会发生就是结果还是1.
如果 你给整个步骤加了锁,执行的时候整个操作不会切换,也就不会出现这种问题。
还有个参考可以看看,虽然感觉没人回答的比较直白:
https://www.zhihu.com/question/23030421
老师,我感觉我钻进了死胡同,久久不能自拔。我迷惑的点是:字节码的原子性跟GIL有没有关系,如果字节码本来就是原子操作,那GIL显然就没有意义了。后面百度发现“CPU指令”是原子操作,突然意识到CPU指令跟Python的字节码指令不在一个维度。所以我做了下面的假设:CPU指令具有原子性的,这是操作系统保障的,而Python的字节码指令并不等价于CPU指令(一个字节码可能有多个CPU指令构成),不具有原子性。所以GIL就是保证字节码的原子性。如果我的理解是对的,那我就明白了,如果不对,还请老师指点一下。
可以这么认为,没大毛病。一个字节码操作对应多个汇编指令
感谢 你这么说一下我也理解了
登录后可查看更多问答,登录/注册
Python工程师面试必看,资深面试官亲授,倍增面试成功率
1.6k 5
905 8
891 7
2.2k 4