aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorprettyboy <prettyboy@yandex-team.com>2022-12-20 18:29:21 +0300
committerprettyboy <prettyboy@yandex-team.com>2022-12-20 18:29:21 +0300
commit0f48a8e8854b8a279fe20ef415dcf58103207fbb (patch)
tree30cd244159c404e4bebcff16536e60b83b79fcf7
parentf37198778abfc9966a20b45117657a92c31d0e17 (diff)
downloadydb-0f48a8e8854b8a279fe20ef415dcf58103207fbb.tar.gz
[library/python/func] Made lazy and lazy_property thread safe
-rw-r--r--library/python/func/__init__.py22
1 files changed, 17 insertions, 5 deletions
diff --git a/library/python/func/__init__.py b/library/python/func/__init__.py
index 7424361635..12a280bddc 100644
--- a/library/python/func/__init__.py
+++ b/library/python/func/__init__.py
@@ -20,14 +20,20 @@ class _Result(object):
def lazy(func):
result = _Result()
+ lock = threading.Lock()
+
@functools.wraps(func)
def wrapper(*args):
try:
return result.result
except AttributeError:
- result.result = func(*args)
+ with lock:
+ try:
+ return result.result
+ except AttributeError:
+ result.result = func(*args)
- return result.result
+ return result.result
return wrapper
@@ -35,11 +41,17 @@ def lazy(func):
def lazy_property(fn):
attr_name = '_lazy_' + fn.__name__
+ lock = threading.Lock()
+
@property
def _lazy_property(self):
- if not hasattr(self, attr_name):
- setattr(self, attr_name, fn(self))
- return getattr(self, attr_name)
+ if hasattr(self, attr_name):
+ return getattr(self, attr_name)
+
+ with lock:
+ if not hasattr(self, attr_name):
+ setattr(self, attr_name, fn(self))
+ return getattr(self, attr_name)
return _lazy_property