我根本没有在 Python 中使用过线程,并且作为一个完全陌生的人问这个问题。
我想知道是否defaultdict
是线程安全的。让我解释一下:
我有
d = defaultdict(list)
默认情况下会为丢失的键创建一个列表。假设我有多个线程同时开始执行此操作:
d['key'].append('value')
最后,我应该以['value', 'value']
. 但是,如果defaultdict
不是线程安全的,如果线程1在检查之后和之前 让给线程2,就会导致交错,另一个线程可能会在其中创建列表并追加。if 'key' in dict
d['key'] = default_factory()
d['key']
'value'
然后当线程 1再次执行时,它会继续执行,d['key'] = default_factory()
这会破坏现有的列表和值,我们最终会进入['key']
.
我查看了 defaultdict 的 CPython 源代码。但是,我找不到任何锁或互斥锁。我猜它不是线程安全的,只要它被记录在案。
昨晚在 IRC 上有些人说 Python 上有 GIL,所以它在概念上是线程安全的。有人说线程不应该在 Python 中完成。我很困惑。想法?