[python] 단일 Flask 프로세스는 몇 개의 동시 요청을 받습니까?

Flask로 앱을 만들고 있지만 WSGI에 대해 잘 모르고 HTTP 기반 Werkzeug입니다. gunicorn과 4 개의 작업자 프로세스로 Flask 응용 프로그램을 제공하기 시작하면 4 개의 동시 요청을 처리 할 수 ​​있습니까?

나는 동시 요청을 의미하지만 초당 요청이나 다른 것은 아닙니다.



답변

을 실행하면 개발 서버를 실행할 때 app.run()단일 동기 프로세스를 얻게되므로 한 번에 하나의 요청 만 처리됩니다.

Gunicorn을 기본 구성으로 유지하고 단순히의 수를 늘리면 --workers기본적으로 app.run()개발 서버 처럼 동작하는 수많은 프로세스 (Gunicorn에서 관리)가 제공됩니다 . 4 명의 작업자 == 4 개의 동시 요청. Gunicorn은 sync기본적으로 포함 된 작업자 유형을 사용하기 때문 입니다.

그것은 Gunicorn 또한, 즉 비동기 근로자 포함하는 것이 중요하다 eventlet하고 gevent(도를 tornado하지만 가장 토네이도 프레임 워크에 사용되는 것 같습니다). 이러한 비동기 작업자 중 하나를 --worker-class플래그 와 함께 지정 하면 Gunicorn은 여러 비동기 프로세스 관리하며 프로세스 는 자체 동시성 관리합니다. 이 프로세스는 스레드를 사용하지 않고 대신 코 루틴을 사용합니다. 기본적으로 각 프로세스 내에서 한 번에 1 개의 작업 만 발생할 수 있지만 (1 개의 스레드) 외부 프로세스가 완료 될 때까지 대기 할 때 (데이터베이스 쿼리 또는 네트워크 I / O 대기) 개체가 ‘일시 중지’될 수 있습니다.

즉, Gunicorn의 비동기 작업자 중 하나를 사용하는 경우 각 작업자는 한 번에 하나 이상의 요청을 처리 할 수 ​​있습니다. 가장 많은 직원 수는 앱의 특성, 환경, 실행되는 하드웨어 등에 따라 다릅니다. 자세한 내용은 Gunicorn의 디자인 페이지 및 소개 페이지에서 gevent의 작동 방식 에 대한 참고 사항을 참조하십시오.


답변

현재는 이미 제공된 것보다 훨씬 간단한 솔루션이 있습니다. 응용 프로그램을 실행할 때 다음과 같이 threaded=True매개 변수를 app.run()호출 에 전달하면 됩니다 .

app.run(host="your.host", port=4321, threaded=True)

werkzeug docs 에서 볼 수있는 또 다른 옵션 은 processes매개 변수 를 사용하는 것입니다.이 매개 변수는 처리 할 최대 동시 프로세스 수를 나타내는 1보다 큰 수를 수신합니다.

  • 스레드 – 프로세스가 각 요청을 별도의 스레드로 처리해야합니까?
  • 프로세스 – 1보다 크면이 최대 동시 프로세스 수까지 새 프로세스에서 각 요청을 처리합니다.

다음과 같은 것 :

app.run(host="your.host", port=4321, processes=3) #up to 3 processes

hererun() 메소드 에 대한 자세한 정보 와 솔루션 및 API 참조를 찾게 한 블로그 게시물 .


참고 : 방법 에 대한 Flask 문서 run()에서는 프로덕션 환경에서 사용하지 않는 것이 좋습니다 ( quote ) : “가볍고 사용하기 쉬운 반면 Flask의 내장 서버는 확장이 잘되지 않아 프로덕션에 적합하지 않습니다. “

그러나 프로덕션 환경으로 이동할 때 권장되는 방법은 배포 옵션 페이지를 가리 킵니다 .


답변

플라스크는 스레드 당 하나의 요청을 동시에 처리합니다. 각각 4 개의 스레드가있는 2 개의 프로세스가있는 경우 8 개의 동시 요청입니다.

플라스크는 스레드 또는 프로세스를 생성하거나 관리하지 않습니다. 이것이 WSGI 게이트웨이 (예 : gunicorn)의 책임입니다.


답변

아닙니다. 그 이상을 확실히 처리 할 수 ​​있습니다.

단일 코어 머신을 실행한다고 가정 할 때 CPU는 실제로 한 번에 하나의 명령 * 만 실행한다는 것을 기억해야합니다.

즉, CPU는 매우 제한된 명령어 세트 만 실행할 수 있으며 클럭 틱당 둘 이상의 명령어를 실행할 수 없습니다 (많은 명령어는 1 틱 이상이 소요됨).

따라서 컴퓨터 과학에서 우리가 이야기하는 대부분의 동시성은 소프트웨어 동시성입니다. 다시 말해, 최상위 CPU를 추상화하고 코드를 동시에 실행하고 있다고 생각하게하는 소프트웨어 구현 계층이 있습니다.

이러한 “사물”은 프로세스 일 수 있으며, 이는 각 프로세스가 자체의 비공유 메모리로 자체 세계에서 실행되고 있다고 생각한다는 의미에서 동시에 실행되는 코드 단위입니다.

또 다른 예는 동시성을 허용하는 프로세스 내부의 코드 단위 인 스레드입니다.

4 명의 작업자 프로세스가 4 개 이상의 요청을 처리 할 수있는 이유는 점점 더 많은 요청을 처리하기 위해 스레드를 시작하기 때문입니다.

실제 요청 제한은 선택한 HTTP 서버, I / O, OS, 하드웨어, 네트워크 연결 등에 따라 다릅니다.

행운을 빕니다!

* 명령은 CPU가 실행할 수있는 가장 기본적인 명령입니다. 예-두 개의 숫자를 추가하고 한 명령에서 다른 명령으로 이동


답변