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

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

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



답변

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와 잘 어울립니다.


답변