У меня есть класс, который загружает в память все ресурсы, необходимые для моего приложения (в основном изображения).
Затем нескольким потокам необходимо получить доступ к этим ресурсам через этот класс. Я не хочу, чтобы каждый экземпляр перезагружал все ресурсы, поэтому я решил использовать шаблон Singleton. Я сделал это так:
class DataContainer(object):
_instance = None
_lock = threading.Lock()
_initialised = True
def __new__(cls, *args, **kwargs):
with cls._lock:
if not cls._instance:
cls._initialised = False
cls._instance = object.__new__(cls, *args, **kwargs)
return cls._instance
def __init__(self, map_name = None):
# instance has already been created
if self._initialised:
return
self._initialised = True
# load images
Это работает нормально, пока я не использую несколько потоков. Но с несколькими потоками каждый поток имеет другой экземпляр. Таким образом, используя 4 потока, каждый из них создает новый экземпляр. Я хочу, чтобы все потоки использовали один и тот же экземпляр этого класса, чтобы ресурсы загружались в память только один раз.
Я также пытался сделать это в том же модуле, где определен класс, но вне определения класса:
def getDataContainer():
global dataContainer
return dataContainer
dataContainer = DataContainer()
но каждый поток по-прежнему имеет свой собственный экземпляр.
Я новичок в Python, если это неправильный подход, пожалуйста, дайте мне знать, я ценю любую помощь.
__new__
, удерживая блокировку. - person Janne Karila   schedule 26.02.2014