python-3.x - Python3 中的 print() 是原子的吗?
问题描述
我知道全局解释器锁 (GIL) 仅在字节码指令之间的线程之间切换,因此列表和字典上的大多数操作都是原子的等。
但是是否print()
对应 Python3 中的单个字节码指令,从而可以认为是原子操作?
奖励:如果一个线程修改(例如插入)到另一个线程正在循环的列表中会发生什么?
http://effbot.org/pyfaq/what-kinds-of-global-value-mutation-are-thread-safe.htm
解决方案
寻找自己:
>>> 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 进行更深入挖掘的结果!
推荐阅读
- ruby-on-rails - Rails 跳过 Gem 的迁移
- node.js - 如何使用 koa 生成缓慢的响应?
- c# - 带有 WPF RichTextBox 图像的 RTF 字符串不会显示在 WinForms RichTextBox 中
- android - 无法在 Brida 中使用应用程序的类
- r - 在 dplyr 中结合使用 minimum 和 mutate 时如何处理重复项?
- security - 从 GPU 中提取数据
- javascript - 有没有一种好方法可以在跨事件发射器/事件循环边界的生产中显示错误跟踪?
- reactjs - 如何使用 Material UI 制作头像选择器
- angular - ng serve 找不到 node.js 核心模块
- servicestack - Servicestack - 将多个 POCO 映射到一个表的可能性