Use locking when creating singleton

This commit is contained in:
Keith Edmunds 2025-01-27 14:25:04 +00:00
parent d3a709642b
commit 4927f237ab

View File

@ -1,9 +1,10 @@
# Standard library imports
from __future__ import annotations
from dataclasses import dataclass, field
from dataclasses import dataclass
from enum import auto, Enum
import functools
import threading
from typing import NamedTuple
# Third party imports
@ -34,12 +35,18 @@ def singleton(cls):
"""
Make a class a Singleton class (see
https://realpython.com/primer-on-python-decorators/#creating-singletons)
Added locking.
"""
lock = threading.Lock()
@functools.wraps(cls)
def wrapper_singleton(*args, **kwargs):
if not wrapper_singleton.instance:
wrapper_singleton.instance = cls(*args, **kwargs)
if wrapper_singleton.instance is None:
with lock:
if wrapper_singleton.instance is None: # Check still None
wrapper_singleton.instance = cls(*args, **kwargs)
return wrapper_singleton.instance
wrapper_singleton.instance = None