python:如果键不在字典中,则添加键。防止多线程竞争条件

91D*_*Dev 4 python multithreading dictionary race-condition

我正在编写一个电报机器人,其中更多的线程处理每个异步更新。我对一个空字典进行硬编码,当机器人运行时,多个线程对其进行写入和读取。

最常见的操作是:

if key not in dict:
    dict[key] = value
else:
    dict[key].append(another_value)
Run Code Online (Sandbox Code Playgroud)

问题是,当一个线程检查 key 是否在 dict 中时,也许不是,另一个线程在其中写入了 key。

所以基本上我必须摆脱这种赛车状况。

我需要一个快速的解决方案。在网上搜索我找到了关于threading.Lock(). 这些答案大约有 10 年的历史。我想知道现在它是否仍然是一个很好的解决方案,或者也许还有一些新的图书馆

kin*_*all 5

您可以使用defaultdictor,如果您想使用常规字典,setdefault()方法。

使用defaultdict:

from collections import defaultdict
mydict = defaultdict(list)    # new key is initialized with an empty list
mydict[key].append(value)     # so it is always safe to append
Run Code Online (Sandbox Code Playgroud)

使用setdefault():

mydict = {}
mydict.setdefault(key, []).append(value)
Run Code Online (Sandbox Code Playgroud)

要么应该是线程安全的,IIRC,即使它们看起来不是那样:方法实现在 C 中,因此不能被 Python 代码中断。因此,例如,绝对不可能同时setdefault()执行两个方法并导致竞争条件。

通常defaultdict是首选,因为它的性能更高,仅在需要时创建空列表,并且生成的代码更简单。该setdefault()版本可能会更好,如果在你的字典一些键可能有非列表值。