Реализация одноэлементного класса и (б) проблемы с блокировкой? - PullRequest
4 голосов
/ 26 февраля 2011

Мне было интересно реализовать одноэлементный класс, следующий за http://code.activestate.com/recipes/52558-the-singleton-pattern-implemented-with-python/, но мне было интересно узнать о любых (b) проблемах блокировки. Предполагается, что мой код кэширует операторы SQL и выполняет все кэшированные операторы, используя cursor.executemany (SQL, list-of-params), когда достигается определенное количество кэшированных элементов или пользователь выполняет определенный вызов execute. Предполагалось, что реализация синглтона позволит кэшировать операторы для всего приложения, но я столкнусь с (b) проблемами с блокировкой.

Есть мысли?

Ответы [ 4 ]

1 голос
/ 06 сентября 2011

Почему бы вам не использовать модуль напрямую (как указывалось ранее, модели являются синглетонами).Если вы создаете такой модуль, как:

# mymodule.py
from mydb import Connection
connection = Connection('host', 'port')

, вы можете использовать механизм импорта, и экземпляр connection будет везде одинаковым.

from mymodule import connection

Конечно, вы можете определитьгораздо более сложная инициализация connection (возможно, через написание собственного класса), но дело в том, что Python будет инициализировать модуль только один раз и предоставлять одинаковые объекты для каждого последующего вызова.

Я считаю, что шаблоны Singleton (или Borg) имеют очень специфические приложения в Python, и по большей части вы должны полагаться на прямой импорт, пока не доказано обратное.

1 голос
/ 03 июня 2011

Избегая ленивой инициализации, проблема блокировки исчезнет.В модуле, где происходит инициализация вашего соединения с базой данных, импортируйте модуль, содержащий синглтон, а затем немедленно создайте экземпляр синглтона, который не сохраняется в переменной.

0 голосов
/ 06 сентября 2011

Пока вы используете CPython - Глобальная блокировка интерпретатора должна предотвращать проблемы с блокировкой.Вы также можете использовать шаблон Борг .

0 голосов
/ 07 мая 2011

Не должно быть проблем, если вы не планируете использовать этот экземпляр Singleton с несколькими потоками.

Недавно я столкнулся с некоторой проблемой, вызванной неправильно реализованным механизмом перезагрузки кэша - данные кэша сначала очищались, а затем заполнялись. Это хорошо работает в однопоточном режиме, но выдает ошибки в многопоточности.

...