From 3aab46036ae14c39b977397777622c8cd83dffb0 Mon Sep 17 00:00:00 2001 From: Robert Goldmann <deadlocker@gmx.de> Date: Sun, 11 Oct 2020 22:13:35 +0200 Subject: [PATCH] MultiCacheKeyService must be thread safe --- .../MultiCacheKeyService.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/TheCodeLabs_BaseUtils/TheCodeLabs_BaseUtils/MultiCacheKeyService.py b/TheCodeLabs_BaseUtils/TheCodeLabs_BaseUtils/MultiCacheKeyService.py index a187392..5260c83 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() -- GitLab