python – getattr / setattr / hasattr / delattr线程是否安全?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – getattr / setattr / hasattr / delattr线程是否安全?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2474字,纯文字阅读大概需要4分钟。
内容图文
![python – getattr / setattr / hasattr / delattr线程是否安全?](/upload/InfoBanner/zyjiaocheng/723/df82abe51b96444486adf49536231c90.jpg)
看到这个Singleton实现:
if not hasattr(Singleton, "_instance"):
with Singleton._instance_lock:
if not hasattr(Singleton, "_instance"):
Singleton._instance = Singleton()
return Singleton._instance
似乎“Singleton._instance = ..”(类似于setattr)和hasattr是原子的.
或者hasattr不会因为setattr而导致崩溃.
但我无法找到任何支持上面’似乎’.
解决方法:
通常,如果您调用操作的对象未在python中实现__getattr__,__delattr__或__setattr__挂钩,则yes,hasattr,getattr,delattr和setattr是原子操作.
就Python线程而言,任何单个字节码都是原子操作. Python评估循环在解释操作码时抓取全局解释器锁(GIL).
您需要查看字节码以查看边界所在的位置:
>>> def foo():
... if not hasattr(Singleton, "_instance"):
... with Singleton._instance_lock:
... if not hasattr(Singleton, "_instance"):
... Singleton._instance = Singleton()
... return Singleton._instance
...
>>> dis.dis(foo)
2 0 LOAD_GLOBAL 0 (hasattr)
3 LOAD_GLOBAL 1 (Singleton)
6 LOAD_CONST 1 ('_instance')
9 CALL_FUNCTION 2
12 POP_JUMP_IF_TRUE 64
3 15 LOAD_GLOBAL 1 (Singleton)
18 LOAD_ATTR 2 (_instance_lock)
21 SETUP_WITH 35 (to 59)
24 POP_TOP
4 25 LOAD_GLOBAL 0 (hasattr)
28 LOAD_GLOBAL 1 (Singleton)
31 LOAD_CONST 1 ('_instance')
34 CALL_FUNCTION 2
37 POP_JUMP_IF_TRUE 55
5 40 LOAD_GLOBAL 1 (Singleton)
43 CALL_FUNCTION 0
46 LOAD_GLOBAL 1 (Singleton)
49 STORE_ATTR 3 (_instance)
52 JUMP_FORWARD 0 (to 55)
>> 55 POP_BLOCK
56 LOAD_CONST 0 (None)
>> 59 WITH_CLEANUP
60 END_FINALLY
61 JUMP_FORWARD 0 (to 64)
6 >> 64 LOAD_GLOBAL 1 (Singleton)
67 LOAD_ATTR 3 (_instance)
70 RETURN_VALUE
故事并没有就此结束; hasattr使用getattr()(测试异常),然后可以调用Python __getattr__钩子.类似地,STORE_ATTR操作码可能最终调用python __setattr__钩子实现.在这两种情况下,GIL都会再次释放.
对于默认实现(Singleton不实现这些钩子),操作是原子的,因为Python C代码处理整个操作而不回退到Python,因此评估循环(GIL可能被释放并再次锁定另一个线程).
当然,您仍然可以处理在object protocol operations期间释放锁定的自定义C库.这是一件不寻常的事情.
内容总结
以上是互联网集市为您收集整理的python – getattr / setattr / hasattr / delattr线程是否安全?全部内容,希望文章能够帮你解决python – getattr / setattr / hasattr / delattr线程是否安全?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。