제수기 - 제발 수업내용을 기억해라 / 단순 수업정리 시리즈
동기 + 블로킹
/ 비동기 + 논블로킹
이렇게 두가지 방식이 자주 쓰인다.
동기(Synchronous)
: 요청을 보낸 후 결과를 받을 때까지 기다린다. 현재 요청한 작업이 완료된 후에야 다음 작업이 실행된다. (HTTP 요청 후 서버 응답이 올 때까지 기다리는 방식)비동기(Asynchronous)
: 요청을 보낸 후 결과를 기다리지 않고 즉시 다음 작업을 수행할 수 있다. 결과가 도착하면 별도의 방식(콜백 함수, Future/Promise, 이벤트 루프 등)으로 처리된다.
처음꺼 실행하고 끝나고 다음꺼 끝나고 다음꺼 ... 이런식으로 직렬적인 시행이 된다.
이게 바로 동기적인 관점 - 직렬적
asyncio
패키지 importasync
를 붙여줘야 한다.await
: 가끔 비동기 함수들은 호출해놓고 반응을 보고 해야 하는 경우도 있다. 비동기 호출은 맞는데 기다렸다가 호출하기 위해서 await. 항상 async def
하위에 있어야 한다.각각의 작업을 기다리기 위한 await asyncio.sleep
병렬적 실행. 실행 한번에 -> 알아서 종료
이런식으로 한번에 요청 -> 한번에 해결 -> 종료
블로킹(Blocking)
: 요청을 보낸 후 제어권을 요청한 코드가 가진 채 대기한다. 해당 작업이 끝나기 전까지 다른 작업을 수행할 수 없다.
논블로킹(Non-blocking)
: 요청을 보낸 후 즉시 제어권을 반환하고 다른 작업을 수행할 수 있다. 데이터가 준비되지 않았을 경우 즉시 반환되며, 이후 필요할 때 다시 확인하는 방식 사용
import aiohttp
필요response = requests.get("https://httpbin.org/delay/2")
: 제어권이 get 사이트로 넘어갔으므로 이제 손가락 빨면서 기다리고 있게 된다.동기 방식과 비슷하다. 그러나 관점이 다르다. '제어권'이 아예 넘어간다.
똑같이 웹요청 보낼건데 제어권은 안 보낼 거야.
비동기로 run해야 하고 aiohttp
패키지 써야 함.
session을 보내고 session.get
🔺await이 없으면 제어권이 넘어가니까 다른 것들도 실행 됐을거다?
chatGPT 대답 :
참고 : https://ko.javascript.info/async-await
병렬적인 응답이 온다.
프로세스 : 프로그램에서 더블클릭해서 실행하면 프로세스가 된다. 작업관리자 프로세스에서도 '실행중인' 것들만 보여준다.
프로세스 하위의 작업단위 : 쓰레드
일꾼 정도로 생각하면 될 거 같다.
여러 개 쓰레드 사용하면 병렬적 작업 가능
멀티 프로세스, 멀티 쓰레드의 개념
아래 그림처럼 프로세스가 별도로 있을 경우 멀티 프로세스, 프로세스 안에 여러개의 쓰레드가 있을 경우 멀티 쓰레드
프로세스 안은 같은 메모리 공간이라서 쓰레드는 메모리 공유
프로레스는 서로 다른 메모리라서 네트워크 연결이 돼야 공유 가능.
CPU 바운드 작업(연산이 많은 작업)에 적합함. 탭 여러개 띄우는 것도 멀티 프로세스다.
쓰레드 간의 메모리 공간 공유. 통신이 빠름.
하지만 동기화 문제가 발생.
쓰레드 많아질수록 프로그램 난의도가 늘어남.
연산작업보다는 I/O 바운드에 적합.
django는 위에 있는 3개를 다 할 수 있다. 적절하게 선택해서 사용해야 함.
과제>
cpu bound 작업 multi-processing 처리하기
실제 장고는 이렇게 사용하지는 않지만 그냥 한번 보기
io bound 작업 multi-threading 처리하기
쓰래딩 패키지 사용. 스레드 생성해서 일을 시키면 된다.
병렬적으로. 프로세스 두개가 각자 올라가서 일함.
일이 늦게 끝나면 기다리라고 join을 씀
io bound 작업 single-thread (비동기 eventloop기반) 처리하기