스레드 락 (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()
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)
## 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")
#...