포도가게의 개발일지
파이썬 (12) 본문
반응형
컨텍스트 관리자
with block
- 컨텍스트 관리자 객체는 with 문을 제어하기 위해 존재
동시성 처리
- 파이썬 코루틴과 스레드는 cpu 위주의 작업에 적합하지 않다.
코루틴
- 멈췄다가 나중에 다시 실행을 재개할수있는 함수. 파이썬에서는 제너레이터가 고전적 코루틴을 만들고, async def로 네이티브 코루틴을 정의할 수 있다.
- 일반적으로 이벤트 루프의 관리하에 하나의스레드 안에서 작동한다. 코루틴과 이벤트 루프는 동일한 스레드에서 실행된다.
- asyncio, Curio, Trio등 비동기 프로그래밍 프레임워크는 논 블로킹 코루틴 기반 io를 지원하는 이벤트 루프와 지원 라이브러리를 제공한다.
- 코루틴은 협업형 멀티태스킹을 지원한다.
- 각 코루틴은 yield, await을 통해 제어권을 양보해야 다른 코루틴이 진행할수있다.
GIL
- 각각의 파이썬 인터프리터 인스턴스는 하나의 프로세스이다.
- 파이썬 인터프리터는 사용자 프로그램과 gc를 실행하는데 스레드 하나를 사용한다.
- 객체 참조 수와 기타 인터프리터 내부 상태에 대한 접근은 GIL이 제어한다. 언제나 하나의 파이썬 스레드만 GIL을 잡을 수 있다. cpu 코어 수에 무관하게 늘 단하나의 스레드만 파이썬 코드를 실행할 수 있다.
- 특정 스레드가 GIL을 무한히 잡는것을 방지하고자, 파이썬 바이트코드 인터프리터는 기본적으로 현재 파이썬 스레드를 5ms마다 중단하고 GIL을 해제한다. 다시 얻을려고 시도할수있지만 다른 스레드가 GIL을 기다리고 있었다면 os 스케줄러는 구중하나를 골라 계속 진행한다.
- 파이썬 코드로 GIL을 제어할수없다. 그러나 c언어로 작성된 내장함수나 확장 모듈에서는 시간이 오래걸리는 task를 실행할때 GIL을 해제할수있다.
- 시스템을 호출하는 모든 파이썬 표준라이브러리는 GIL을 해제한다.
- GIL을 얻기 위한 경쟁은 계산 위주인 파이썬 스레드의 속도를 떨어뜨린다. 오히려 단인 스레드 코드가 더 간단하고 빠르게 처리한다.
- 다중 코어시스템에서 cpu 위주의 파이썬 코드를 실행하려면 여러개의 파이썬 프로세스를 사용해야한다.
코루틴
- 코루틴을 coro() 형태로 호출하면 코루틴 객체가 반환되지만, coro() 함수의 본체를 실행시키지 않는다. 코루틴 본체를 실행하는것은 이벤트 루프의 일이다.
- 제어권을 asyncio 이벤트 루프로 돌려줘야 이벤트 루프가 다른 대기중인 코루틴을 실행할수있다.
Comments