Process, Port, 서비스의 의미(gunicorn worker 실습)
Process
우리는 운영체제를 통해 한번에 여러 프로그램들을 실행할 수 있다.
프로세스는 그 운영체제에 의해 실행중인 프로그램을 의미한다.
process 는 foreground 와 background 로 나뉜다.
* 시스템에 의해 실행되어 background 에서 돌아가는 프로그램을 서비스 혹은 데몬이라고 부른다.
* process 는 각각 독립된 메모리 영역을 할당 받는다.
* 하나의 process 는 1개 이상의 “쓰레드(Thread)" 를 가지고 있다.
Thread 와 Process 의 차이
프로세스는 운영체제로부터 자원을 할당 받는 작업의 단위이다.
스레드는 할당 받은 자원을 이용하는 실행의 단위이고 프로세스 내에 여러개 생길 수 있다.
* 파이썬에서는 GIL 제약 때문에 동시에 여러 쓰레드를 실행하긴 어렵다.
* 한번에 1개 이상의 쓰레드를 실행하기 위해서, 요즘은 이벤트 루프 (async io) 를 사용한다. (병렬화 작업)
GIL
GIL은 파이썬 인터프리터에 한 개의 Thread가 하나의 바이트코드를 실행할 수 있도록 걸어두는 Lock이다.
하나의 Thread는 파이썬 인터프리터의 모든 자원을 사용하나 다른 Thread는 사용할 수 없도록 Lock을 건다는 의미이다.
Port
process 즉 운영체제가 실행중인 프로그램은 효율적인 운영을 위해 하나당 하나의 주소를 부여한다.
이 주소를 port라고 한다.
* HTTP 의 기본 포트는 80 이고, HTTPS 의 기본 포트는 443 이다.
* gunicorn worker 실습
1. 새 장고 프로젝트 생성
2. gunicorn 설치
3. allowed host 에 0.0.0.0 추가
4. urls.py 수정
# urls.py
from time import sleep
from django.contrib import admin
from django.http import HttpResponse
from django.urls import path
def hi(request):
print(f"processing: {request.GET.get('hi')}")
sleep(5)
return HttpResponse('hihi')
urlpatterns = [
path('admin/', admin.site.urls),
path('', hi)
]
실행 - 기본적으로 하나의 gunicorn 프로세스는 동시에 “하나의" 요청만 처리한다.
* 명령어 뒤에 & 를 붙이면 백그라운드에서 실행합니다.
* Async Worker 를 사용하면 하나의 워커가 동시에 여러개의 요청을 처리할 수 있다.
`poetry run gunicorn guni_test.wsgi:application --bind 0.0.0.0:8000 --workers 1`
`curl "0.0.0.0:8000?hi=1" & curl "0.0.0.0:8000?hi=2" & echo "start"`