오늘도 개발
Asyncio와 비동기 작업 1) 개요 - 비동기적 처리란? 코루틴이란? 본문
1. 개요
CPU bound VS I/O bound
CPU bound는 CPU가 작업의 처리 속도에 가장 큰 영향을 미치는 작업. (ex. 계산)
I/O bound는 Input, Output을 기다리는 시간이 작업의 처리 속도에 가장 큰 영향을 미치는 작업. (ex. 네트워크 통신)
CPU bound 작업을 더 빨리 하려면 더 좋은 CPU를 장착하면 된다.
I/O bound 작업은 기다리는 수 밖에 없다.
하지만 보통 프로그램에는 CPU bound와 I/O bound 작업이 혼재한다.
Input, Output을 기다리는 동안 CPU bound 작업을 하면 프로그램 전체 실행 속도를 높일 수 있다.
동기적 처리(synchronouse) VS 비동기적 처리(asynchronouse)
동기적 처리는 CPU bound이든, I/O bound이든 한 작업이 끝나야 다음 작업을 하는 방식.
비동기적 처리는 I/O bound 작업을 기다리는 동안 다른 작업을 하는 방식.
ex) 동기적 처리 - A의 주문을 받고 커피를 다 내린 다음에 B 주문을 받는 것
ex) 비동기적 처리 - A 주문을 받고 커피를 내리는 동안 B 주문을 받는 것.
singlethread VS multithread
thread는 thread of execution의 줄임말. 작업의 흐름.
singlethread는 작업 흐름이 하나만 있는 프로그램.
multithread는 작업 흐름이 여러 개인 프로그램.
파이썬은 기본적으로 singlethread 위에서 동작하므로,
파이썬 비동기 프로그램도 singlethread로 동작한다.
=> 비동기 프로그램은 multithread를 사용해서 동시에 여러 작업을 처리하는 것 (x)
=> 비동기 프로그램은 singlethread를 효과적으로 사용해서 동시에 여러 작업을 처리하는 효과를 내는 것 (o)
Asyncio
비동기적으로 작동하는 프로그램을 만들 수 있게 해주는 파이썬 라이브러리.
2. Coroutine
Subroutine
Subroutine은 일반적인 함수.
함수 호출 시 함수 첫줄~끝줄 차례대로 실행.
마지막 줄 또는 return에 이르면 함수 종료.
같은 함수 다시 호출하면 첫줄~끝줄 차례대로 실행.
Coroutine
Coroutine은 실행을 중단했다가 재개할 수 있는 함수.
함수 호출 시 함수 첫줄부터 yield나 await까지 실행.
yield나 await에 이르면 함수 실행 중단하고 함수 바깥에게 실행 양보.
다시 호출하면 함수 내 yield나 await 다음 줄부터 실행.
Event Loops와 Tasks
서브루틴만 존재하는 경우 thread는 하나의 call stack을 갖는다.
코루틴이 있는 경우 thread는 여러 개의 call stack을 갖는다.
정확히 말하면 코루틴이 있는 경우 thread는 Event Loop를 갖는다.
Event Loop 안에는 Tasks라는 리스트가 있는데,
Tasks 안에 들어있는 Task가 각각의 call stack을 갖는다.
하지만 파이썬은 한 번에 한 Task만 실행한다.
한 Task의 call stack이 실행중이면 다른 Task의 call stack은 자동으로 대기 상태에 들어간다.
각 Task의 함수는 일반 함수처럼 실행되다가
yield나 await 키워드를 만나면 I/O bound 작업을 기다리기 시작한다.
이 때 Task는 event loop에게 다음과 같이 전달한다.
1) 내가 기다리는 동안 다른 Task를 실행해라.
2) 내가 기다리는 결과를 얻으면 나에게로 돌아와 내가 멈춘 곳부터 실행해라.
*call stack이란?
함수, 함수와 관련된 변수를 저장하는 공간. (자바스크립트로 치면 execution context)
함수를 호출하면 stack frame이 call stack에 쌓이고, 함수가 종료되면 stack frame이 pop된다.
Native coroutine
asyncio에서 제공하는 async, await을 사용해서 만든 코루틴을 네이티브 코루틴이라고 한다.
참고
'웹 프로그래밍 > Python3' 카테고리의 다른 글
| Asyncio와 비동기 작업 3) async with, async for (0) | 2022.08.30 |
|---|---|
| Asyncio와 비동기 작업 2) Awaitables(Coroutine, Task, Future) (0) | 2022.08.24 |
| Iterator, Generator, Coroutine (0) | 2022.08.17 |
| Python unittest 모듈로 Unit Test해보기 (0) | 2022.08.05 |
| Min, Max 함수 (0) | 2022.07.13 |