如果有一个 Python 字典并且有多个线程添加到它,如果我知道每个线程都将添加到它自己的键中,我是否必须同步添加元素。(我的意思是不能同时对同一个键进行加法)。
问问题
2296 次
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 回答