Bug report
Bug description:
Ideally, defaultdict would provide atomic "compute and add only if key is absent" behavior. When __missing__ is called, another thread might insert the key. Or, it can be inserted between the call to the factory function and the PyObject_SetItem() call.
It would help to call PyDict_SetDefaultRef() so that an existing value is not replaced. That still has the issue that the factory function is called when a value already exists for that key but that is arguably a less serious problem. We should not be replacing an existing value.
CPython versions tested on:
CPython main branch
Operating systems tested on:
Linux
Linked PRs
Bug report
Bug description:
Ideally, defaultdict would provide atomic "compute and add only if key is absent" behavior. When
__missing__is called, another thread might insert the key. Or, it can be inserted between the call to the factory function and thePyObject_SetItem()call.It would help to call
PyDict_SetDefaultRef()so that an existing value is not replaced. That still has the issue that the factory function is called when a value already exists for that key but that is arguably a less serious problem. We should not be replacing an existing value.CPython versions tested on:
CPython main branch
Operating systems tested on:
Linux
Linked PRs
defaultdictkeep existed value when racing with__missing__#142668defaultdictkeep existed value when racing with__missing__(GH-142668) #142832defaultdictkeep existed value when racing with__missing__(GH-142668) #142858