GIL (Global Interpreter Lock)
- 하나의 스레드만이 CPU를 점유하도록 하는 락
concurrent.futures
- 스레딩 단점
- 관련된 오류나 경합조건을 고치기가 어려움
- 더 많은 OS 자원을 사용함
asyncio
- 코루틴: async def 로 정의된 비동기 함수
- eventloop: 실행가능한 비동기 작업을 관리하는 루프
- Task: 이벤트 루프에서 실행되는 코루틴
- Future: 나중에 완료될 작업을 나타내는 객체
awaitable: await 키워드를 붙일 수 있는 최소 조건
- 대안 Future or Task로 감싸는 것
graph TD;
Awaitable --> Coroutine
Awaitable --> Future
Future --> Task
await의 역할
- await는 뒤에 있는 코루틴을 eventloop에 실행해달라고 등록
- 등록한 코루틴이 끝날때 돌려받기를 기대하며 실행권을 eventloop에 반환함
스레드당 실행중인 EventLoop는 하나 아무리 많은 코루틴을 하나의 EventLoop에서 동시 실행해도 결국 single thread로 돌아감
- 실행 권한이라는 건 뭘까
- 실행권(Time Slice)
- CPU 코어 한개는 한번에 하나의 작업만 실행할 수 있음
- 실행권(Time Slice)
concurrent.futures와의 관계
- concurrent.futures의 ThreadPoolExecutor, ProcessPoolExecutor는 너무 저수준의 api
- 스레드 경합 문제는 해결하기 어려움
concurrent.futures.ThreadPooolExecutor 동작
동시성 구현 5가지 종류(자원관리, 서버 아키텍쳐 관점) z 작성중 - 동시성 모델의 종류(실행 제어 관점)