0

如果有一个 Python 字典并且有多个线程添加到它,如果我知道每个线程都将添加到它自己的键中,我是否必须同步添加元素。(我的意思是不能同时对同一个键进行加法)。

4

1 回答 1

3

当每个线程的键不是唯一的时,您可能需要同步对字典对象的访问。访问不一定是线程安全的。

您始终可以使用dis(反汇编程序)模块来验证任何 python 代码;python线程上下文可以在任何操作码之间切换(操作码本身是原子执行的);对字典的访问可以分布在几个操作码上:

>>> def foo():
...     somedict = {}
...     somedict['bar'] = 'spam'
... 
>>> import dis
>>> dis.dis(foo)
  2           0 BUILD_MAP                0
              3 STORE_FAST               0 (somedict)

  3           6 LOAD_CONST               1 ('spam')
              9 LOAD_FAST                0 (somedict)
             12 LOAD_CONST               2 ('bar')
             15 STORE_SUBSCR        
             16 LOAD_CONST               0 (None)
             19 RETURN_VALUE        

somedict['bar'] = spam行涉及 4 个操作码,加载somedict引用、加载'bar''spam'常量以及调用存储操作。线程上下文可以在任何这些操作码之间切换。

也就是说,如果您的密钥保证每个线程都是唯一的,那么您可以不锁定结构而侥幸;与所有操作码一样,STORE_SUBSCR操作码由 GIL 下的 Python 解释器执行,因此多个线程存储和读取各自密钥中的信息应该是安全的。

Python 标准库库在几个位置执行此操作;thread.thread_ident()用作字典键将每个线程的信息存储在字典中。例如,该threading模块_active保留了一个以线程标识符为键的模块全局字典。

于 2013-03-11T10:16:13.147 回答