Потокобезопасная синглтонная версия на основе ответа gmds
from multiprocessing.dummy import Pool as ThreadPool
import threading
import time
class ThreadSafeSingleton:
__instance = None
__lock = threading.Lock()
def __init__(self, *args, **kwargs):
self.args = args
self.kwargs = kwargs
def __str__(self):
return 'id: {}, args: {}, kwargs: {}'.format(id(self), self.args, self.kwargs)
def __new__(cls, *args, **kwargs):
with cls.__lock:
if cls.__instance is None:
# sleep just simulate heavy class initialization !!
# process under concurrency circumstance !!
time.sleep(1)
print('created')
cls.__instance = super(ThreadSafeSingleton, cls).__new__(cls)
return cls.__instance
class ThreadUnsafeSingleton:
__instance = None
def __init__(self, *args, **kwargs):
self.args = args
self.kwargs = kwargs
def __str__(self):
return 'id: {}, args: {}, kwargs: {}'.format(id(self), self.args, self.kwargs)
def __new__(cls, *args, **kwargs):
if cls.__instance is None:
time.sleep(1)
print('created')
cls.__instance = super(ThreadUnsafeSingleton, cls).__new__(cls)
return cls.__instance
def create_safe(*args, **kwargs):
obj = ThreadSafeSingleton(*args, **kwargs)
print(obj)
def create_unsafe(*args, **kwargs):
obj = ThreadUnsafeSingleton(*args, **kwargs)
print(obj)
if __name__ == '__main__':
pool = ThreadPool(4)
print('---- test thread safe singleton ----')
pool.map(create_safe, range(10))
print('\n---- test thread unsafe singleton ----')
pool.map(create_unsafe, range(10))
Вывод:
---- test thread safe singleton ----
created
id: 4473136352, args: (0,), kwargs: {}
id: 4473136352, args: (1,), kwargs: {}
id: 4473136352, args: (2,), kwargs: {}
id: 4473136352, args: (4,), kwargs: {}
id: 4473136352, args: (5,), kwargs: {}
id: 4473136352, args: (3,), kwargs: {}
id: 4473136352, args: (6,), kwargs: {}
id: 4473136352, args: (7,), kwargs: {}
id: 4473136352, args: (8,), kwargs: {}
id: 4473136352, args: (9,), kwargs: {}
---- test thread unsafe singleton ----
created
id: 4473136968, args: (0,), kwargs: {}
created
created
created
id: 4473136968, args: (4,), kwargs: {}
id: 4473137024, args: (2,), kwargs: {}
id: 4473137080, args: (1,), kwargs: {}
id: 4473137136, args: (3,), kwargs: {}
id: 4473137136, args: (5,), kwargs: {}
id: 4473137136, args: (7,), kwargs: {}
id: 4473137136, args: (6,), kwargs: {}
id: 4473137136, args: (8,), kwargs: {}
id: 4473137136, args: (9,), kwargs: {}