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


138

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

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

답변:


183

을 실행하면 개발 서버를 실행할 때 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의 작동 방식 에 대한 참고 사항을 참조하십시오.


4
Gunicorn은 이제 버전 19부터 "실제"스레드를 지원합니다 . this and this를 참조하십시오 .
Filipe Correia

2
어떤 리소스가 공유되고 어떤 방법으로 스레드와 프로세스간에 완전히 분리되어 있는지 추적하는 방법은 무엇입니까? 예를 들어 Gunicorn이 처리하고 Flask 처리기에서 사용하는 여러 프로세스간에 거대한 데이터 구조를 공유하려는 상황을 어떻게 처리합니까?
Johann Petrak 2018 년

@Johsm이 요구하는 것은 운영 체제 내의 여러 프로세스간에 데이터를 공유하는 방법을 묻는 것과 같습니다. 이에 대한 대답은 귀하의 질문에 대답 할 수 있습니다. 프로세스는 다른 프로세스와 메모리를 공유하지 않기 때문에 외부 저장소를 사용해야합니다. Gunicorn은 멀티 프로세싱 CPU 아키텍처만을 사용하지만 이러한 문제는 처리하지 않습니다.
adkl

이브는 어때? 이브도 마찬가지입니까?
Eswar

2
플라스크 개발 서버는 v1.0 이후 기본적으로 스레드를 사용합니다 ( github.com/pallets/flask/pull/2529 )
hychou

40

현재는 이미 제공된 것보다 훨씬 간단한 솔루션이 있습니다. 응용 프로그램을 실행할 때 다음과 같이 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의 내장 서버는 확장이 잘되지 않아 프로덕션에 적합하지 않습니다. "

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


5
정보 주셔서 감사합니다. 실행 문서는 보안 또는 성능 요구 사항을 충족하지 않는다는 프로덕션 환경에서 사용해서는 안된다는 것을 언급하는 것이 중요합니다.
Coffee_fan

1
@Coffee_fan 당신이 맞아요. 최신 1.1.x에서도 이러한 기능을 사용하지 말고 대신 프로덕션을 진행할 때 배포 옵션 페이지를 확인하십시오 . 답에 귀중한 관찰 내용 포함 :)
DarkCygnus

33

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

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


9

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

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

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

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

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

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

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

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

행운을 빕니다!

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


1
실이나 플라스크가 산란되어 있습니까? 두 가지 가능성을 뒷받침하는 증거를 찾지 못했습니다.
jd.

1
물론 프로세스에 대해서는 이해하지만 필요에 따라 더 많은 스레드가 생성됩니다. 그것이 내가 확인하고 싶은 것입니다.
jd.

4
"단일 코어 머신을 실행한다고 가정하면 CPU는 실제로 한 번에 하나의 명령 * 만 실행합니다" 이것은 최신 머신에서는 올바르지 않습니다. 대부분의 최신 CPU는 파이프 라인수퍼 스칼라 로 단일 코어에도 여러 실행 단위와 소프트웨어 측면에서 볼 수있는 "기계 코드"를 개별 실행 단위로 디스패치되는 실제 하드웨어 마이크로-오피스로 변환하는 명령 디코더가 있습니다.
Michael Geary

1
명확하게 설명하자면, CPU는 실제로 실행 코드 (머신 코드)에서 숫자 명령을 직접 실행했습니다. 모든 CPU 레퍼런스에는 메모리 레퍼런스를 포함하여 각 명령어에 걸린 클럭 사이클 수를 나타내는 명령어 타이밍 차트가 있습니다. 따라서 시간을 추가하여 코드 조각이 얼마나 오래 걸리는지 알 수 있습니다. 최신 CPU는 전혀 그렇지 않습니다. 한 가지 흥미로운 예외는있다 BeagleBone 현대 슈퍼 스칼라 ARM 프로세서가 고정 명령 타이밍이 구식 "PRU"프로세서를.
Michael Geary

1
그리고 명확히하는 것을 내가 말했을 때, "현대"나는 ARM / 인텔 / AMD 칩과 같은 프로세서에 대한 느슨한 속기로 사용되었다 - 파이프 라인, 슈퍼 스칼라 등 물론 고정 타이밍과 기존의 방식으로 작동 최신 프로세서도 있습니다 중 내가 언급 한 BeagleBone PRU 및 다양한 새로운 마이크로 컨트롤러와 같은 명령 당. (그리고 지금 다시 Gunicorn에!)
마이클 기어 리
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.