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