Python中与Java的concurrentHashMap相当的是什么?

7
我知道在Python中字典是原子的,但(请纠正我是否错了),这意味着一次只能完成对字典的单个添加操作。根据Java关于concurrentHashMap的页面所说:“表格被内部分区以尝试在没有争用的情况下允许指定数量的并发更新。” Python中仅有原子插入不会比Java实现速度更快吗?
编辑:当我写“这意味着一次只能完成对字典的单个添加操作”时,我想说的是基于单个字典添加将离散化字典状态。

你可能想要查看multiprocessing模块中的Manager对象。 - Hai Vu
1个回答

13
在 Python 中,由于全局解释器锁(GIL)的存在,无论有多少个线程,一个进程一次只能执行一个 Python 字节码。这意味着对字典进行插入/更新/读取键是线程安全的,这通常是人们所说的字典的get/put是“原子”的含义。 但这也意味着,正如您所怀疑的那样,尝试同时更新同一字典的不同键的多个线程将不是并发的。当然,Java并没有全局解释器锁的问题,因此多个线程可以同时更新ConcurrentHashMap中的不同键。这并不总是发生;它仅仅是可能的。ConcurrentHashMap实现将键集分片,并锁定每个分片。每个分片可以被并发读取,但一次只能有一个线程写入。
†:有时会指出,使用Python编写的具有__hash__方法的对象将需要多个Python字节码,因此放置和获取本质上不是原子的。但是,简单的放置和获取仍然是线程安全的,这意味着它们不会导致崩溃或垃圾值,尽管您仍然可能遇到竞态条件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接