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