Nathaniel Smith <[email protected]> added the comment:
Just found this while searching to see if we had an existing way to combine
WeakValueDictionary + defaultdict. The use case I've run into a few times is
where you need a keyed collection of mutexes, like e.g. asyncio.Lock objects.
You want to make sure that if there are multiple tasks trying to access the
same key/resource, they all acquire the same lock, but you don't want to use a
regular defaultdict, because that will end up growing endlessly as different
keys/resources are encountered.
It'd be very handy to do something like:
lock_dict = WeakValueDictionary(default=asyncio.Lock)
async with lock_dict[key]:
...
and have everything magically work.
The alternative is to open-code the default handling at the call site, either:
# Wasteful: creates a new Lock object on every usage,
# regardless of whether it's actually needed.
async with lock_dict.setdefault(key, asyncio.Lock()):
...
Or else the verbose:
lock = lock_dict.get(key)
if lock is None:
lock = lock_dict[key] = asyncio.Lock()
async with lock:
...
----------
nosy: +njs
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue31254>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com