개요
Flask를 디버그 모드로 실행할 때, 동일한 서버에 대한 프로세스가 두 개가 실행됩니다.
일반적인 웹 서비스라면 문제가 없는데, 프로세스 내에서 하나의 자원을 다루어야 하는 경우에 충돌이 발생하는 경우가 있습니다.
Flask에서 두 개의 프로세스가 실행되는 것이 버그는 아니고 Flask의 변경된 소스를 다시 읽는(Reloader) 기능 때문입니다.
이 기능은 개발 중 코드 변경을 감지하여 자동으로 서버를 재시작하는 데 사용됩니다.
Flask는 코드 변경을 감지하기 위해 메인 프로세스와 함께 하위 프로세스를 생성하여 코드를 모니터링합니다.
하위 프로세스가 동일하게 실행되기 때문에 서버의 초기화 코드가 두 번 실행됩니다. 그래서 하나의 자원을 다루어야 하는 경우 충돌이 발생하게 됩니다.
Flask를 두 개의 프로세스가 실행되지 않고 하나의 프로세스로 실행되도록 하는 방법을 알아 보겠습니다.
해결 방법
"use_reloader=False" 설정
app.run() 또는 flask run 명령어에 "use_reloader=False" 옵션을 추가하여 변경된 소스를 다시 읽는(Reloader) 기능을 비활성화합니다.
app.run(debug=True, use_reloader=False)
또는 CLI에서 실행할 경우에는 다음과 같이 "--no-reload" 옵션을 추가합니다.
flask run --no-reload
위와 같이 하면 코드 변경 시 자동 재시작이 비활성화되고, 서버 프로세스가 하나만 실행됩니다.
WERKZEUG_RUN_MAIN 환경 변수 사용
하위 프로세스에서만 코드가 실행되도록 WERKZEUG_RUN_MAIN 환경 변수를 활용할 수 있습니다.
import os
if os.environ.get('WERKZEUG_RUN_MAIN') == 'true':
# 초기화 코드
이 방법은 변경된 소스를 다시 읽는(Reloader) 기능을 유지하면서도 초기화 코드가 한 번만 실행되도록 합니다.
프로덕션 환경에서 디버그 모드 비활성화
프로덕션 환경에서는 디버그 모드를 비활성화하여 변경된 소스를 다시 읽는(Reloader) 기능을 완전히 제거할 수 있습니다.
app.run(debug=False)
이 방법은 개발 환경과 실제 운영 환경을 명확히 구분할 때 유용합니다.
맺음말
위와 같이 다양한 방법들을 통해 Flask 서버의 중복 실행 문제를 해결할 수 있습니다.
'프로그래밍 > Python' 카테고리의 다른 글
[python] CRC-32 검사하기 (0) | 2024.07.15 |
---|---|
[python] 코드가 실행중일 때, 디버깅 중인지 확인하는 방법 (0) | 2024.07.05 |
[Python] 품질 설정과 함께 이미지를 JPEG로 저장 방법들 (0) | 2024.07.04 |
[Python] Flask - Server 헤더 변경하기 (0) | 2024.07.03 |
[python] "v1.v2.v3.v4" 버전 문자열을 숫자들로 변환하기 (0) | 2024.07.02 |