Source code for ewoks.graph_cache

from collections import OrderedDict
from functools import wraps
from typing import Dict, Optional

from ewokscore.hashing import uhash
from ewokscore.graph import TaskGraph

_GRAPH_CACHE: Dict[int, TaskGraph] = OrderedDict()
_GRAPH_CACHE_MAX_SIZE: int = 0


[docs]def cache(load_method): @wraps(wraps) def wrapper(*args, graph_cache_max_size: Optional[int] = None, **kw): set_cache_max_size(graph_cache_max_size) if _GRAPH_CACHE_MAX_SIZE <= 0: return load_method(*args, **kw) graph_id = uhash((args, kw)) graph = _GRAPH_CACHE.pop(graph_id, None) if graph is None: graph = load_method(*args, **kw) _GRAPH_CACHE[graph_id] = graph _check_cache_size() return graph return wrapper
[docs]def set_cache_max_size(graph_cache_max_size: Optional[int] = None) -> None: global _GRAPH_CACHE_MAX_SIZE if graph_cache_max_size is not None: _GRAPH_CACHE_MAX_SIZE = graph_cache_max_size _check_cache_size()
def _check_cache_size() -> None: while _GRAPH_CACHE and len(_GRAPH_CACHE) > _GRAPH_CACHE_MAX_SIZE: _GRAPH_CACHE.popitem(last=False)