mirror of https://github.com/hpcaitech/ColossalAI
aibig-modeldata-parallelismdeep-learningdistributed-computingfoundation-modelsheterogeneous-traininghpcinferencelarge-scalemodel-parallelismpipeline-parallelism
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
27 lines
921 B
27 lines
921 B
import threading |
|
|
|
|
|
class SingletonMeta(type): |
|
""" |
|
Thread-safe Singleton Meta with double-checked locking. |
|
Reference: https://en.wikipedia.org/wiki/Double-checked_locking |
|
""" |
|
|
|
_instances = {} |
|
_lock = threading.Lock() |
|
|
|
def __call__(cls, *args, **kwargs): |
|
# First check (without locking) for performance reasons |
|
if cls not in cls._instances: |
|
# Acquire a lock before proceeding to the second check |
|
with cls._lock: |
|
# Second check with lock held to ensure thread safety |
|
if cls not in cls._instances: |
|
instance = super().__call__(*args, **kwargs) |
|
cls._instances[cls] = instance |
|
else: |
|
assert ( |
|
len(args) == 0 and len(kwargs) == 0 |
|
), f"{cls.__name__} is a singleton class and an instance has been created." |
|
|
|
return cls._instances[cls]
|
|
|