Джанго: синглтон за запрос?
У нас есть оболочка вокруг запроса suds (SOAP), которую мы используем в нашем приложении следующим образом:
from app.wrapper import ByDesign
bd = ByDesign()
К сожалению, эта реализация выполняется в нескольких точках на запрос, что приводит к повторной загрузке файла WSDL с помощью suds, и я думаю, что мы могли бы сэкономить некоторое время, сделав bd = ByDesign()
вернуть синглтон.
Так как suds не является потокобезопасным, он должен быть одиночным на запрос.
Единственная загвоздка в том, что я хотел бы сделать это, чтобы мне не нужно было менять какой-либо код, кроме app.wrapper.ByDesign
класс, так что мне не нужно менять код, который его вызывает. Если бы не было требования "singleton per request", я бы сделал что-то вроде этого:
class ByDesignRenamed(object):
pass
_BD_INSTANCE = None
def ByDesign():
global _BD_INSTANCE
if not _BD_INSTANCE:
_BD_INSTANCE = ByDesignRenamed()
return _BD_INSTANCE
Но это не будет работать в многопоточной серверной среде. Есть идеи для меня?
1 ответ
Проверьте threading.local(), который находится где-то между чистым злом и единственным способом добиться успеха. Вероятно, должно быть что-то вроде этого:
import threading
_local = threading.local()
def ByDesign():
if 'bd' not in _local.__dict__:
_local.bd = ByDesignRenamed()
return _local.bd
Дальнейшее чтение: