首页 > 解决方案 > Python3 中的 print() 是原子的吗?

问题描述

我知道全局解释器锁 (GIL) 仅在字节码指令之间的线程之间切换,因此列表和字典上的大多数操作都是原子的等。

但是是否print()对应 Python3 中的单个字节码指令,从而可以认为是原子操作?

奖励:如果一个线程修改(例如插入)到另一个线程正在循环的列表中会发生什么?

http://effbot.org/pyfaq/what-kinds-of-global-value-mutation-are-thread-safe.htm

标签: python-3.x

解决方案


寻找自己:

>>> import dis
>>> dis.dis(lambda: print("foo"))
  1           0 LOAD_GLOBAL              0 (print)
              2 LOAD_CONST               1 ('foo')
              4 CALL_FUNCTION            1
              6 RETURN_VALUE

所以只有CALL_FUNCTION,仅此而已......除非print它本身很复杂?

>>> dis.dis(print)
TypeError: don't know how to disassemble builtin_function_or_method objects

所以,print是一个内置的,用 C 语言编写的,调用它只是一个字节码(如果你不考虑将参数放在堆栈上以准备调用)。

编辑:但请看 Anthony Sottile 进行更深入挖掘的结果!


推荐阅读