Flask API 개발2

손호준·2022년 12월 15일
0

1. connectionpool 추가 사항

스레드 락 (thread lock) : 여러 스레드를 실행하여 공유 자원에 접근 할 때 lock 해줘야함. lock을 acquire() 하면 해당 스레드만 공유 데이터에 접근할 수 있고, lock을 release() 해야만 다른 스레드에서 공유 데이터에 접근할 수 있음. ThreadedConnectionPool은 알아서 locking 함.

## ThreadedConnectionPool 소스 코드

class ThreadedConnectionPool(AbstractConnectionPool):
    """A connection pool that works with the threading module."""

    def __init__(self, minconn, maxconn, *args, **kwargs):
        """Initialize the threading lock."""
        import threading
        AbstractConnectionPool.__init__(
            self, minconn, maxconn, *args, **kwargs)
        self._lock = threading.Lock() # locking

    def getconn(self, key=None):
        """Get a free connection and assign it to 'key' if not None."""
        self._lock.acquire()
        try:
            return self._getconn(key)
        finally:
            self._lock.release()

    def putconn(self, conn=None, key=None, close=False):
        """Put away an unused connection."""
        self._lock.acquire()
        try:
            self._putconn(conn, key, close)
        finally:
            self._lock.release()

    def closeall(self):
        """Close all connections (even the one currently in use.)"""
        self._lock.acquire()
        try:
            self._closeall()
        finally:
            self._lock.release()

2. 캐싱

from flask_caching import Cache

config  = {
    "DEBUG" :  True,
    "CACHE_TYPE" : "simple",
    "CACHE_DEFAULT_TIMEOUT" : 300
}
app = Flask(__name__)
app.config.from_mapping(config)
cache = Cache(app) # 캐시 설정

#################################################
@app.route("/", methods = ['GET'])
@cache.cached()
def f1_server():
    return "f1_server run" # 리턴 값은 클라이언트가 수신하는 값(Response)

캐싱 전 후 속도 비교

캐싱 전

캐싱 후

3. 로깅

## mylogger.py

import logging

mylogger = logging.getLogger("my") # 로거 생성
mylogger.setLevel(logging.INFO) # 로깅 레벨 설정 

formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") # 포매팅 지정

# handler는 로그 메시지를 지정된 대상으로 전달하는 역할
stream_handler = logging.StreamHandler() # 콘솔 출력
stream_handler.setFormatter(formatter) # 콘솔 출력에 포매터 적용
mylogger.addHandler(stream_handler)

file_handler = logging.FileHandler('my.log') # 파일 출력
file_handler.setFormatter(formatter) # 파일에 포매터 적용
mylogger.addHandler(file_handler)


### 실제 사용 예시
## __init__.py
#...
mylogger.info("server start")
#...

4. API 명세 작성

profile
Rustacean🦀/Data engineer💻

0개의 댓글