제수기 > Django > 작업실행 모델 이해하기

Eunbi Jo·2025년 2월 5일
0

제수기

목록 보기
83/90
제수기 - 제발 수업내용을 기억해라 / 단순 수업정리 시리즈

Django 작업실행 모델 이해하기

  • 동기 + 블로킹 / 비동기 + 논블로킹 이렇게 두가지 방식이 자주 쓰인다.

개념 - 동기/비동기

  • 동기(Synchronous) : 요청을 보낸 후 결과를 받을 때까지 기다린다. 현재 요청한 작업이 완료된 후에야 다음 작업이 실행된다. (HTTP 요청 후 서버 응답이 올 때까지 기다리는 방식)
  • 비동기(Asynchronous) : 요청을 보낸 후 결과를 기다리지 않고 즉시 다음 작업을 수행할 수 있다. 결과가 도착하면 별도의 방식(콜백 함수, Future/Promise, 이벤트 루프 등)으로 처리된다.

코드 - 동기/비동기

동기 작업

처음꺼 실행하고 끝나고 다음꺼 끝나고 다음꺼 ... 이런식으로 직렬적인 시행이 된다.

이게 바로 동기적인 관점 - 직렬적

비동기 작업

  • asyncio 패키지 import
  • def 앞에 async를 붙여줘야 한다.
  • await : 가끔 비동기 함수들은 호출해놓고 반응을 보고 해야 하는 경우도 있다. 비동기 호출은 맞는데 기다렸다가 호출하기 위해서 await. 항상 async def 하위에 있어야 한다.

각각의 작업을 기다리기 위한 await asyncio.sleep

병렬적 실행. 실행 한번에 -> 알아서 종료

이런식으로 한번에 요청 -> 한번에 해결 -> 종료


개념 - 블로킹 / 논블로킹

블로킹(Blocking) : 요청을 보낸 후 제어권을 요청한 코드가 가진 채 대기한다. 해당 작업이 끝나기 전까지 다른 작업을 수행할 수 없다.
논블로킹(Non-blocking) : 요청을 보낸 후 즉시 제어권을 반환하고 다른 작업을 수행할 수 있다. 데이터가 준비되지 않았을 경우 즉시 반환되며, 이후 필요할 때 다시 확인하는 방식 사용

코드 - 블로킹 / 논블로킹

블로킹

  • import aiohttp 필요
  • response = requests.get("https://httpbin.org/delay/2") : 제어권이 get 사이트로 넘어갔으므로 이제 손가락 빨면서 기다리고 있게 된다.
  • 여기서 https://httpbin.org/delay/2는 2초 있다가 응답을 주겠다는 사이트다. 에이작스에서 실제 jason 데이터가 온 거다.

동기 방식과 비슷하다. 그러나 관점이 다르다. '제어권'이 아예 넘어간다.

넌블럭 코드

똑같이 웹요청 보낼건데 제어권은 안 보낼 거야.
비동기로 run해야 하고 aiohttp 패키지 써야 함.

session을 보내고 session.get


🔺await이 없으면 제어권이 넘어가니까 다른 것들도 실행 됐을거다?

chatGPT 대답 :

참고 : https://ko.javascript.info/async-await

병렬적인 응답이 온다.

프로세스/쓰레드 구분하기

  • 프로세스 : 프로그램에서 더블클릭해서 실행하면 프로세스가 된다. 작업관리자 프로세스에서도 '실행중인' 것들만 보여준다.

  • 프로세스 하위의 작업단위 : 쓰레드

  • 일꾼 정도로 생각하면 될 거 같다.

  • 여러 개 쓰레드 사용하면 병렬적 작업 가능

멀티 프로세스, 멀티 쓰레드의 개념
아래 그림처럼 프로세스가 별도로 있을 경우 멀티 프로세스, 프로세스 안에 여러개의 쓰레드가 있을 경우 멀티 쓰레드

프로세스 안은 같은 메모리 공간이라서 쓰레드는 메모리 공유
프로레스는 서로 다른 메모리라서 네트워크 연결이 돼야 공유 가능.

병렬처리방식

멀티프로세스. 프로세스를 여러개 띄우는 거

CPU 바운드 작업(연산이 많은 작업)에 적합함. 탭 여러개 띄우는 것도 멀티 프로세스다.

멀티 쓰레드

쓰레드 간의 메모리 공간 공유. 통신이 빠름.
하지만 동기화 문제가 발생.
쓰레드 많아질수록 프로그램 난의도가 늘어남.
연산작업보다는 I/O 바운드에 적합.

이벤트 루프 기반

  • 경제성이 돋보임.
  • 아까 비동기 방식이 사람 일처리 하는 것과 비슷하다. 이벤트 루프는 겁나 일 잘하는 알바생 딱 한명만 쓰는 거. 오래 걸리는 건 미뤘다가 하고, 급한거 부터 파바박 하는. 일머리가 좋은.
  • 쓰레드 하나.
  • 대규모 처리는 어렵다. 하지만 경제성 측면에서 좋다.
  • I/O 바운드에 적합.

django는 위에 있는 3개를 다 할 수 있다. 적절하게 선택해서 사용해야 함.

과제>
cpu bound 작업 multi-processing 처리하기
실제 장고는 이렇게 사용하지는 않지만 그냥 한번 보기

io bound 작업 multi-threading 처리하기
쓰래딩 패키지 사용. 스레드 생성해서 일을 시키면 된다.
병렬적으로. 프로세스 두개가 각자 올라가서 일함.
일이 늦게 끝나면 기다리라고 join을 씀

io bound 작업 single-thread (비동기 eventloop기반) 처리하기

0개의 댓글