Python相当于Java的concurrentHashMap?
Posted
技术标签:
【中文标题】Python相当于Java的concurrentHashMap?【英文标题】:Python equivalent of concurrentHashMap from Java? 【发布时间】:2018-06-15 21:28:39 【问题描述】:我知道字典在 python 中是原子的,但是(如果我错了,请纠正我)这意味着一次只能完成对字典的一个添加。根据 concurrentHashMap 的 Java 页面:“该表在内部进行了分区,以尝试允许指定数量的并发更新而不会发生争用。”仅在 python 中的原子插入不会在速度上与 Java 实现相提并论
编辑:当我写“这意味着一次只能完成对字典的单个添加”时,我的意思是说字典的状态将根据单个字典添加进行离散化
【问题讨论】:
您可能想查看multiprocessing 模块中的Manager
对象
【参考方案1】:
在 Python 中,由于全局解释器锁 (GIL),一个进程一次只能执行一个 Python 字节码,而不管它有多少线程。这意味着插入/更新/读取字典的键是线程安全的,这就是人们通常说字典的 get/put 是“原子的”的意思。†
但这意味着,正如您所怀疑的那样,尝试将不同键更新到同一个字典的多个线程将不会并发。当然,Java 没有 GIL 问题,因此多个线程可以同时更新 ConcurrentHashMap 中的不同键。这并不总是发生。这是可能的。 ConcurrentHashMap 实现对一组键进行分片并锁定每个分片。每个分片可以并发读取,但一次只能写入一个线程。
†:有时会指出用 Python 编写的带有 __hash__
方法的对象将需要多个 Python 字节码,因此 put 和 get 本身不是原子的;然而,简单的 put 和 get 仍然是线程安全的,因为它们不会导致崩溃或垃圾值,尽管您仍然可以有竞争条件。
【讨论】:
以上是关于Python相当于Java的concurrentHashMap?的主要内容,如果未能解决你的问题,请参考以下文章