답변:
flask.Flask.run전달할 추가 키워드 인수 ( **options)를 허용합니다. 인수 중 werkzeug.serving.run_simple두 개는 threaded(부울)이며 processes(요청을 처리하기 위해 둘 이상의 프로세스를 생성하도록 하나보다 큰 수로 설정할 수 있습니다).
threadedTrueFlask 1.0을 기본값으로 사용 하므로 최신 버전의 Flask의 경우 기본 개발 서버는 기본적으로 여러 클라이언트를 동시에 제공 할 수 있습니다. 이전 버전의 Flask의 threaded=True경우이 동작을 사용하도록 명시 적으로 전달할 수 있습니다.
예를 들어, 할 수 있습니다
if __name__ == '__main__':
app.run(threaded=True)
이전 Flask 버전과 호환되는 방식으로 스레드를 사용하여 여러 클라이언트를 처리하거나
if __name__ == '__main__':
app.run(threaded=False, processes=3)
Werkzeug에게 수신 요청을 처리하기 위해 세 가지 프로세스를 생성하도록 지시하거나
if __name__ == '__main__':
app.run()
Flask 1.0 이상을 사용한다는 것을 알고 있다면 스레드를 사용하여 여러 클라이언트를 처리합니다.
즉, Werkzeug 's serving.run_simple는 표준 라이브러리의 wsgiref패키지를 감싸고 있으며 ,이 패키지에는 프로덕션 용 웹 서버가 아닌 WSGI의 참조 구현이 포함되어 있습니다. 프로덕션에서 Flask를 사용하려는 경우 ( "프로덕션"이 동시 사용자가 10 명 이하인 트래픽이 적은 내부 응용 프로그램이 아니라고 가정 할 경우) 실제 웹 서버 뒤에 서 있어야합니다 (Flask 문서 섹션의 제목 참조). 몇 가지 제안 된 방법에 대한 배포 옵션 ).
app.run()Flask 에서 단순 을 사용하면 한 번에 하나의 클라이언트에만 서비스를 제공 할 수있는 단일 스레드에서 단일 동기 서버가 작성됩니다. 정확히 이런 이유로 수요가 적은 (즉, 개발, 디버깅) 통제 된 환경에서 사용하기위한 것입니다.
파이썬 GIL 때문에 스레드를 생성하고 직접 관리하는 것은 그리 멀지 않을 것 입니다.
즉, 여전히 좋은 옵션이 있습니다. Gunicorn 은 견고하고 사용하기 쉬운 WSGI 서버로 여러 작업자 (별도의 프로세스이므로 걱정할 필요가 없음)를 생성 할 수 있으며, 비동기 작업자 가 제공 되므로 앱 속도를 높이고 보안을 강화할 수 있습니다. 특히 Flask와 관련하여 아무런 작업도하지 않습니다.
그럼에도 불구하고 Gunicorn조차도 직접 공개적으로 노출되어서는 안됩니다. 프로덕션 환경에서는보다 강력한 HTTP 서버 뒤에 사용해야합니다. nginx 는 Gunicorn 및 Flask와 잘 어울립니다.
gunicorn app:app 127.0.0.1:8080대신 앱을 실행할 수 있습니다 python app.py. Nginx에 귀하의 개인 Gunicorn 운영하는 응용 프로그램에 노출 공공 서비스의 역할을 것이다 (리버스 프록시) 아마 등, 직접 정적 파일을 제공, 낮은 수준의 HTTP 구현 세부 사항의 모든 종류를 숨기고,
processes=100하고 만족할 수 있습니까? 필자의 경우 정적 파일 만 필요하고 HTTP Post 메소드는 필요하지 않습니다. 내 요구 사항은 모든 Flask 스레드를 부모 앱의 일부로 실행하여 변수를 공유 할 수 있기를 원합니다.