카테고리 없음

Process, Port, 서비스의 의미(gunicorn worker 실습)

abccoco 2022. 7. 15. 09:17

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"`