diff --git a/TheCodeLabs_BaseUtils/TheCodeLabs_BaseUtils/MultiCacheKeyService.py b/TheCodeLabs_BaseUtils/TheCodeLabs_BaseUtils/MultiCacheKeyService.py index a1873927dac26b080fa52e9e0eaac06dfbb6b97b..5260c830e3195cfb76de3ae6f8eb89e1129ad84f 100644 --- a/TheCodeLabs_BaseUtils/TheCodeLabs_BaseUtils/MultiCacheKeyService.py +++ b/TheCodeLabs_BaseUtils/TheCodeLabs_BaseUtils/MultiCacheKeyService.py @@ -1,4 +1,5 @@ import abc +import threading from abc import ABC from dataclasses import dataclass from datetime import datetime @@ -14,18 +15,22 @@ class CacheEntry: cachedData: Dict +lock = threading.Lock() + + class MultiCacheKeyService(ABC): def __init__(self): self._cache = {} def get_data(self, cacheKey: str, fetchIntervalInSeconds: int, settings: Dict) -> Dict: - if cacheKey not in self._cache: - self._cache[cacheKey] = CacheEntry(cacheKey, fetchIntervalInSeconds, settings, 0, {}) - - cacheEntry = self._cache[cacheKey] - if self.__is_data_obsolete(cacheEntry): - cacheEntry.cachedData = self._fetch_data(cacheEntry.settings) - return cacheEntry.cachedData + with lock: + if cacheKey not in self._cache: + self._cache[cacheKey] = CacheEntry(cacheKey, fetchIntervalInSeconds, settings, 0, {}) + + cacheEntry = self._cache[cacheKey] + if self.__is_data_obsolete(cacheEntry): + cacheEntry.cachedData = self._fetch_data(cacheEntry.settings) + return cacheEntry.cachedData def __is_data_obsolete(self, cacheEntry: CacheEntry) -> bool: now = datetime.now().timestamp()