Flask를 Apache 또는 다른 웹 서버와 연결할 수 있다는 것을 알고 있습니다. 그러나 Flask를 여러 클라이언트를 동시에 제공하는 독립형 서버로 생각하고있었습니다.
이게 가능해? 여러 스레드 생성 및 관리를 처리해야합니까?
답변
flask.Flask.run
전달할 추가 키워드 인수 ( **options
)를 허용합니다. 인수 중 werkzeug.serving.run_simple
두 개는 threaded
(부울)이며 processes
(요청을 처리하기 위해 둘 이상의 프로세스를 생성하도록 하나보다 큰 수로 설정할 수 있습니다).
threaded
True
Flask 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와 잘 어울립니다.