Один интересный вариант - создать класс Lockable DIctionary, который будет сам блокироваться в зависимости от фрейма exection вызывающего. : -)
Самоанализ Python позволяет это сделать - и в зависимости от ваших потребностей это может подойти -
(вы должны были бы поймать исключение, возникающее в тех местах, где вы хотите использовать значение, хотя -
Я не использую Django, поэтому я не знаю, используют ли повторные запросы потоки - если да, (а не асинхронный ответ по одному потоку для всех запросов), вы можете заменить возникшее на некоторое время исключение - sleep - retry цикл.
from inspect import stack
class DictLocked(Exception):
pass
class LockableDict(dict):
def __init__(self, *args, **kw):
dict.__init__(self, *args, **kw)
self.locked = False
self.locker = None
def start_update(self):
print stack()
self.locked = True
#Holds the code frame responsible for locking
self.locker = stack()[1][0]
def finish_update(self):
self.locked = False
def __getitem__(self, item):
print stack()
if self.locked:
if stack()[1][0] != self.locker:
raise DictLocked("Dictionary locked")
return dict.__getitem__(self, item)
def __setitem__(self, item, value):
if self.locked:
if stack()[1][0] != self.locker:
raise DictLocked("Dictionary locked")
return dict.__setitem__(self, item, value)