Вопрос проверяет понимание принципов многопоточности и умение проектировать структуры данных, безопасные для конкурентного доступа, что критично для высоконагруженных приложений.
Потокобезопасный кэш — это структура данных, которая хранит временные результаты (часто пары ключ-значение) и обеспечивает корректный доступ к ним из нескольких потоков одновременно. Без должной синхронизации конкурентные операции чтения и записи могут привести к повреждению данных, состоянию гонки (race condition) или неопределённому поведению программы.
Существует несколько стратегий для достижения потокобезопасности:
ConcurrentHashMap в Java, concurrent.futures в Python).Рассмотрим простой кэш с фиксированным временем жизни записи (TTL) и блокировкой на уровне всей структуры.
import threading
import time
class ThreadSafeCache:
def __init__(self):
self._cache = {}
self._lock = threading.Lock()
def get(self, key):
"""Получить значение по ключу. Возвращает None, если ключ отсутствует или запись устарела."""
with self._lock:
entry = self._cache.get(key)
if entry is None:
return None
value, expiry = entry
if time.time() > expiry:
del self._cache[key] # Удаляем просроченную запись
return None
return value
def set(self, key, value, ttl_seconds=60):
"""Установить значение с временем жизни."""
with self._lock:
expiry = time.time() + ttl_seconds
self._cache[key] = (value, expiry)
def delete(self, key):
"""Удалить запись по ключу."""
with self._lock:
self._cache.pop(key, None)
В этом примере мьютекс (self._lock) защищает все операции со словарём _cache. Контекстный менеджер with self._lock: гарантирует, что блокировка будет освобождена даже при возникновении исключения.
Потокобезопасные кэши широко используются в:
Вывод: Потокобезопасный кэш стоит реализовывать или использовать готовые решения в любом многопоточном приложении, где требуется разделяемое состояние с частыми операциями чтения и относительно редкими обновлениями. Выбор между простой блокировкой, сегментированием или lock-free подходами зависит от ожидаемой нагрузки и требований к задержкам.