33 lines
		
	
	
		
			902 B
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			33 lines
		
	
	
		
			902 B
		
	
	
	
		
			Python
		
	
	
	
	
	
from functools import wraps
 | 
						|
from typing import Any, Callable
 | 
						|
 | 
						|
import redis
 | 
						|
 | 
						|
import utils.hashing_utils
 | 
						|
from backend import config
 | 
						|
 | 
						|
redis_client = redis.from_url(
 | 
						|
    config.CELERY_BROKER_URL,
 | 
						|
)
 | 
						|
 | 
						|
 | 
						|
def lock(lock_key: str, include_args_in_key=False) -> Callable:
 | 
						|
    def decorator(func: Callable) -> Callable:
 | 
						|
        @wraps(func)
 | 
						|
        def wrapper(*args, **kwargs) -> Any:
 | 
						|
            key = lock_key
 | 
						|
            if include_args_in_key:
 | 
						|
                key += '_' + utils.hashing_utils.hash_args_and_kwargs_with_crc32(*args, **kwargs)
 | 
						|
            redis_lock = redis_client.lock(key)
 | 
						|
            acquired = redis_lock.acquire(blocking=False)
 | 
						|
            if not acquired:
 | 
						|
                raise Exception(f'Lock {key} is already acquired')
 | 
						|
            try:
 | 
						|
                return func(*args, **kwargs)
 | 
						|
            finally:
 | 
						|
                redis_lock.release()
 | 
						|
 | 
						|
        return wrapper
 | 
						|
 | 
						|
    return decorator
 |