프로그래밍/Python

[python] Flask 단일 프로세스로 실행하기

채윤아빠 2024. 7. 10. 10:19

개요

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 서버의 중복 실행 문제를 해결할 수 있습니다.



728x90
반응형