我从未在Python中使用过线程,作为一个完全陌生的人提出这个问题。
我想知道 defaultdict
是否是线程安全的。让我解释一下:
我有
d = defaultdict(list)
默认情况下,它会为缺失的键创建一个列表。假设我启动了多个线程同时执行此操作:
d['key'].append('value')
最后,我应该得到['value', 'value']
。但是,如果defaultdict
不是线程安全的,在检查 if 'key' in dict
之后,并在d ['key'] = default_factory()
之前,如果线程1让步给线程2,那么就会发生交错,并且另一个线程可能会在d ['key']
中创建列表并追加'value'
。
然后当线程1再次执行时,它将从d ['key'] = default_factory()
继续执行,这将销毁现有的列表和值,我们将以['key']
结束。
我查看了CPython defaultdict
的源代码。然而,我找不到任何锁或互斥体。我猜只要它被记录下来,那么它就不是线程安全的。
昨晚一些人在IRC上说Python有GIL,因此从概念上讲是线程安全的。有人说Python不应该使用多线程。我很困惑。你有什么想法?