Джанго: синглтон за запрос?

У нас есть оболочка вокруг запроса 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

Дальнейшее чтение:

Другие вопросы по тегам