thread pool vs. event loop
- thread pool 은 CPU bound 작업에 유리하고, event loop 는 IO bound 작업에 유리하다.
Event Loop
- Event Loop 는 IO 작업을 마주쳤을 때, 그 작업이 끝날 때 까지 다른 작업을 실행한다. 이를 통해 동시처리를 할 수 있다.
- Python 의 경우, 단일 thread 위에서 도는 작업 스케쥴러다.
- asyncio 라이브러리가 event loop 기능을 제공한다.
1. 실행 가능한 coroutine 을 작업 큐에 넣는다.
2. coroutine 을 실행한다.
3. await 을 만나면 멈추고, 다른 coroutine 을 실행한다.
4. io 작업이 끝나면, 다시 작업 큐에 넣는다.
5. loop
예). db 호출 - sqlalchemy async 라이브러리 기능을 쓸 경우,
async def func():
await db_call()
- async 함수 밑에 blocking 코드를 넣으면 메인 thread 가 블락된다.
예). CPU bound 작업을 구현해야 하는 경우,
- await run_in_threadpool(task) 와 같이 thread pool 을 활용할 수 있다.