본문 바로가기
Python/API

동일 API 호출에 대한 처리 방법(feat. asyncio)

by JONGSKY 2023. 9. 5.
728x90
SMALL

1. 글을 쓰게 된 계기

 

동일 API를 호출하는 경우들이 굉장히 많다.

 

현재 상황은 다음과 같다.

API요청이 들어왔을 때

해당 API에서 동작되는 함수들이 실행되고 최종적으로는 해당 결과가 db에 저장되도록 되어있다.

 

여기서 불필요한 API호출를 방지하기 위해

1. db에 있는 경우 함수가 작동되지 않도록 했다.

2. 함수가 작동되고 있는 경우 (기존과 동일한 요청에서 대해서) 함수가 작동되지 않도록 했다.

 

내가 글을 작성하는 내용은 2번의 상황을 해결하는 것이다.

 

2. 해결 방법

 

간단하게 asyncio.Lock()을 사용하면 해결할 수 있다.

 

emailUid_locks = {}

# emailUid = "test1234"

if emailUid in emailUid_locks:
    logging.info(f"already being generated for the same emailUid")
    return False
        
emailUid_locks[emailUid] = asyncio.Lock()

try:
    async with emailUid_locks[emailUid]:
    # 함수 실행코드
    
finally:
    del emailUid_locks[emailUid]
    
return True

 

위 코드를 실행하게 되면

emailUid에 대한 요청이 들어와서 실행되었을 때

동일한 emailUid에 대해서 요청이 있었는지 확인하고 있을 경우에는 False를 Return 해준다.

 

이렇게 되면 불필요하게 동일한 emailUid에 대한 request에 대해서 처리할 필요가 없다.

 

3. 참고문서

 

Synchronization Primitives

Source code: Lib/asyncio/locks.py asyncio synchronization primitives are designed to be similar to those of the threading module with two important caveats: asyncio primitives are not thread-safe, ...

docs.python.org

 

728x90
LIST

'Python > API' 카테고리의 다른 글

uvicorn 이란 무엇인가? (feat. ASGI)  (0) 2024.04.03
gunicorn은 무엇인가? (feat. WSGI)  (1) 2024.04.03
기존 database를 가져와서 ORM 만들기  (0) 2022.12.11
[FastAPI] FastAPI와 DB(MySQL) 연결하기  (0) 2022.11.30
ORM vs SQL Mapper  (0) 2022.11.05