On Apr 28, 2020, at 16:25, Steven D'Aprano <steve@pearwood.info> wrote:
On Tue, Apr 28, 2020 at 11:45:49AM -0700, Raymond Hettinger wrote:
It seems like you would get just about everything you want with one line:
once = lru_cache(maxsize=None)
But is it thread-safe?
You can add thread safety the same way as any other function: @synchronized @once def spam(): return 42 in a slow and non-thread-safe and non-idempotent way and also launch the missiles the second time we’re called Or wrap a with lock: around the code that calls it, or whatever. Not all uses of once require thread safety. For the really obvious example, imagine you’re sharing a singleton between coroutines instead of threads. And if people are really concerned with the overhead of lru_cache(maxsize=None), the overhead of locking every time you access the value is probably even less acceptable when unnecessary. So, I think it makes sense to leave it up to the user (but to explain the issue in the docs). Or maybe we could add a threading.once (and asyncio.once?) as well as functools.once?