Flask app.run ()을 독립형으로 사용하여 여러 고객에게 서비스를 제공 할 수 있습니까?


201

Flask를 Apache 또는 다른 웹 서버와 연결할 수 있다는 것을 알고 있습니다. 그러나 Flask를 여러 클라이언트를 동시에 제공하는 독립형 서버로 생각하고있었습니다.

이게 가능해? 여러 스레드 생성 및 관리를 처리해야합니까?

답변:


295

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 문서 섹션의 제목 참조). 몇 가지 제안 된 방법에 대한 배포 옵션 ).


2
최대 100 명의 사용자를보고 있다면 어떻게합니까? 할당 processes=100하고 만족할 수 있습니까? 필자의 경우 정적 파일 만 필요하고 HTTP Post 메소드는 필요하지 않습니다. 내 요구 사항은 모든 Flask 스레드를 부모 앱의 일부로 실행하여 변수를 공유 할 수 있기를 원합니다.
ATOzTOA

4
Chuckles- @ATOzTOA-아니요, 아마도 상당히 비생산적 일 것입니다 (프로세스는 상대적으로 비싸며 각 요청에서 많은 작업을 수행하지 않는 한 4 또는 8 프로세스가 충분하지 않은 이유는 없습니다). 즉, 정적 컨텐츠 만 표시하는 경우이를 수행하도록 최적화 된 서버 (Apache, ngnix, IIS)를 사용하는 것이 좋습니다.
Sean Vieira

2
또한, 일반적으로 요청을 통해 공유 변수를 필요가 없습니다 - 당신이 경우에 당신이 중 하나 개의 프로세스에 자신을 제한하거나 (레디 스, 데이터베이스, 파일 시스템 등) 일부 대역 외 통신을 사용해야합니다 그래서 각 프로세스가 동기화 된 상태로 유지됩니다.
Sean Vieira 2013

3
@ ATOzTOA-더 나은 서버를 만들 수 없다면 소용돌이를 내고 무슨 일이 일어나는지 확인하십시오. 로드가 잘되지 않으면 다른 웹 서버 뒤에 배포 할 수 있습니다.
Sean Vieira

2
@ATOzTOA, 왜 '스레드'와 '프로세스'를 동시에 지정할 수 없는지에 대한 질문에 대해서는 다음 코드를 참조하십시오 : werkzeug.readthedocs.org/en/latest/_modules/werkzeug/serving
pyrho

62

app.run()Flask 에서 단순 을 사용하면 한 번에 하나의 클라이언트에만 서비스를 제공 할 수있는 단일 스레드에서 단일 동기 서버가 작성됩니다. 정확히 이런 이유로 수요가 적은 (즉, 개발, 디버깅) 통제 된 환경에서 사용하기위한 것입니다.

파이썬 GIL 때문에 스레드를 생성하고 직접 관리하는 것은 그리 멀지 않을 것 입니다.

즉, 여전히 좋은 옵션이 있습니다. Gunicorn 은 견고하고 사용하기 쉬운 WSGI 서버로 여러 작업자 (별도의 프로세스이므로 걱정할 필요가 없음)를 생성 할 수 있으며, 비동기 작업자 가 제공 되므로 앱 속도를 높이고 보안을 강화할 수 있습니다. 특히 Flask와 관련하여 아무런 작업도하지 않습니다.

그럼에도 불구하고 Gunicorn조차도 직접 공개적으로 노출되어서는 안됩니다. 프로덕션 환경에서는보다 강력한 HTTP 서버 뒤에 사용해야합니다. nginx 는 Gunicorn 및 Flask와 잘 어울립니다.


17
좀 빠지는. Gunicorn은 파이썬이며 nginx는 아닙니다. 그래도 사용 방법이 아닙니다. Gunicorn을 사용하면 gunicorn app:app 127.0.0.1:8080대신 앱을 실행할 수 있습니다 python app.py. Nginx에 귀하의 개인 Gunicorn 운영하는 응용 프로그램에 노출 공공 서비스의 역할을 것이다 (리버스 프록시) 아마 등, 직접 정적 파일을 제공, 낮은 수준의 HTTP 구현 세부 사항의 모든 종류를 숨기고,
라이언 Artecona

(스레드 = 참) app.run 플라스크 사용하여 아파치에 아주 좋은 실행 mod_wsgi에 flask.palletsprojects.com/en/1.1.x/deploying/mod_wsgi
MortenB
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.