python-检查字典中的键是原子操作吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-检查字典中的键是原子操作吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1622字,纯文字阅读大概需要3分钟。
内容图文
![python-检查字典中的键是原子操作吗?](/upload/InfoBanner/zyjiaocheng/676/6fdb3912f15a4b888391f3b1b9a983d7.jpg)
是否在检查字典中是否有键-如果mydict中的键是原子操作?
如果不是这样,如果另一个线程正在修改字典时一个线程正在检查密钥,将会有负面影响吗?检查线程不会修改字典,只是根据键的存在而有所不同.
解决方法:
我认为“原子”并不是您真正感兴趣的.
如果您不使用CPython(或者您正在使用,但其中一个线程正在运行不在GIL之下的C代码…),则它绝对不是原子的,但是在某些情况下还是安全的.
如果您使用的是CPython,则在某种意义上说是原子的,因为它是一个单字节码操作(COMPARE_OP 6),在更有用的意义上,实际的哈希表查找本身肯定在GIL下发生,并且任何潜在的相等比较都肯定发生在保证能存活的物体上.但是它可能仍然不安全,除非在某些情况下.
首先,您在此处执行的更高级别的操作本质上就是不讲究情趣.如果线程1可以同时执行d [‘foo’] = 3或del d [‘foo’],则线程0在d中调用’foo’时,没有正确的答案.这不是原子问题,这里没有排序.
但是,如果在应用程序级别上确实有某种显式排序,那么有一个正确的答案要得到,那么只有两个线程都持有GIL时,才能保证得到正确的答案.我想这就是您要问的,是吗?
这仅在CPython中甚至是可能的,并且即使在那儿,它也等于保证您尝试放入哈希或==它时,放置在dict中的任何对象都不会释放GIL,这通常很难保证.
现在,如果另一个线程只是替换与某个键关联的值而不更改键集怎么办?然后有一个正确的答案,并且可以同时使用,只要dict实现可以避免为此操作更改哈希表.至少在CPython版本中,直到10年7月29日发布的版本为止. Alex Martelli在对python dictionary is thread safe?的回答中间接地保证了这一点.因此,在这种受限情况下,您在CPython中和其他实现中都是安全的,但您希望在依赖该代码之前先阅读代码.
正如评论中指出的那样,您可能最终无法将与之比较的键值保证是不变的,因此,即使其他线程不做任何更改键值集的操作,也仍不能绝对保证您会得到正确的答案. (您可能必须设计一种病理学的密钥类型才能使此操作失败,但它仍然是合法的密钥类型.)
内容总结
以上是互联网集市为您收集整理的python-检查字典中的键是原子操作吗?全部内容,希望文章能够帮你解决python-检查字典中的键是原子操作吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。