본문 바로가기

Development/Django

[Django] Gunicorn - Threads

728x90

django logo

Gunicorn은 평소에 쓰던 WSGI( Web Server Gateway Interface )이다. WSGI의 종류에는 uWSGI, Gunicorn 등등 많지만, 그 중에서도 가볍고 더 빠른 gunicorn을 사용하게 되었다.

Procfile에 쓰여져 있는 프로세스 Gunicorn 명령어에서 못 보던 옵션을 보았다. 바로 --threads 이다.

blog.winterjung.dev/2018/04/08/flask-concurrency-test

 

gunicorn으로 flask에서 동시에 여러 요청 처리

flask 앱 내부적으로 blocking 작업이 있다고 할 때, A 클라이언트가 해당 API를 호출하면 B 클라이언트 요청은 A의 요청이 다 처리될 때 까지 기다린 후에야 처리되기 시작한다. 때문에 외부 API 호출(r

blog.winterjung.dev

위 링크에 따르면 "Django 앱을 Gunicorn으로 실행하고 CPU bound 작업을 위한다면 -w 옵션 (number of worker processes)을, IO bound 작업을 위한다면 --threads 옵션 (number of worker threads)을 신경쓰면서 기본적으로 -k 옵션 (worker class)을 gevent 등의 async worker로 설정하는 것을 추천한다"고 한다.

-w는 worker의 개수를 결정하며 독립적인 프로세스로 django 앱이 실행된다.

--threads는 각 워커마다 가질 thread 개수를 결정한다.

만약 -w 4 --threads 4 옵션을 사용했다면 한번에 16개의 IO를 처리할 수 있다.

더보기

Thread란?

스레드(thread)는 프로세스 내에서 실제로 작업을 수행하는 주체를 의미합니다. 모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행합니다. 또한, 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스(multi-threaded process)라고 합니다.

프로세스(process)란?


프로세스(process)는 단순히 실행중인 프로그램(program)이라고 할 수 있습니다. 즉, 사용자가 작성한 프로그램이 운영체제에 의해 메모리 공간을 할당받아 실행 중인 것을 말합니다. 이러한 프로세는 프로그램에 사용되는 데이터와 메모리 등의 자원 그리고 스레드로 구성됩니다.

[참고] www.tcpschool.com/java/java_thread_concept

Thread란?

스레드(thread)는 프로세스 내에서 실제로 작업을 수행하는 주체를 의미합니다. 모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행합니다. 또한, 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스(multi-threaded process)라고 합니다.

프로세스(process)란?


프로세스(process)는 단순히 실행중인 프로그램(program)이라고 할 수 있습니다. 즉, 사용자가 작성한 프로그램이 운영체제에 의해 메모리 공간을 할당받아 실행 중인 것을 말합니다. 이러한 프로세는 프로그램에 사용되는 데이터와 메모리 등의 자원 그리고 스레드로 구성됩니다.

[참고] www.tcpschool.com/java/java_thread_concept

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

cpu bound 작업은 물리적 코어 수, IO bound 작업은 논리적 코어 수에 의존한다.

만약 물리적 코어가 2개인 머신에서 cpu bound 작업을 처리할 때 -w를 2로 주나 4로 주나 유의미한 차이는 없으며 오히려 오버헤드가 발생한다.

공식적인 문서에서 권장하는 워커와 스레드 개수는 2 * $NUM_CPU + 1이다.

Celery를 사용한다면

celery는 메시지 패싱 방식의 분산 비동기 작업 큐로 pdf 변환, audio render등의 오랜 시간이 걸리는 작업들을 백그라운드에서 비동기적으로 처리한다. 

유저한테 처리 결과를 즉시 반환할 필요가 없을 때 사용할 수 있지만 이 역시 뷰 함수의 처리가 다 끝날 때 까지 다른 클라이언트의 요청은 처리되지 않는다.
728x90