Source code for nv_ingest.util.nim.decorators
import logging
from functools import wraps
from multiprocessing import Lock
from multiprocessing import Manager
logger = logging.getLogger(__name__)
# Create a shared manager and lock for thread-safe access
manager = Manager()
global_cache = manager.dict()
lock = Lock()
[docs]
def multiprocessing_cache(max_calls):
"""
A decorator that creates a global cache shared between multiple processes.
The cache is invalidated after `max_calls` number of accesses.
Args:
max_calls (int): The number of calls after which the cache is cleared.
Returns:
function: The decorated function with global cache and invalidation logic.
"""
def decorator(func):
call_count = manager.Value("i", 0) # Shared integer for call counting
@wraps(func)
def wrapper(*args, **kwargs):
key = (func.__name__, args, frozenset(kwargs.items()))
with lock:
call_count.value += 1
if call_count.value > max_calls:
global_cache.clear()
call_count.value = 0
if key in global_cache:
return global_cache[key]
result = func(*args, **kwargs)
with lock:
global_cache[key] = result
return result
return wrapper
return decorator