블로킹 호출을 에둘러 실행하기

매일 공부(ML)·2023년 5월 25일
0

Fluent Python

목록 보기
127/130

제어 흐름

asyncio를 이용한 동시성

블로킹 호출을 에둘러 실행하기

블로킹 함수를 디스크나 네트워크 입출력의 수행으로 정의하면서, 논블로킹 함수처럼 다루면 안된다. -라이언 달-

블로킹 함수가 전체 애플리케이션의 실행을 멈추지 않게 하는 두 가지 방법

  • 블로킹 연산을 각기 별도의 스레드에서 실행
  • 모든 블로킹 연산을 논블로킹 비동기 연산으로 바꾼다.

스레드는 제대로 작동하지만, 파이썬이 사용하는 OS 스레드는 각기 수메가바이트의 메모리를 사용하고, 수천 개의 연결을 처리해야 한다면 연결마다 하나의 스레드를 사용할 수 없다.

전통적으로 메모리 부담을 줄이기 위해 콜백으로 비동기 호출을 구현하고, 하드웨어 인터럽트와 비슷한 저수준 개념이고, 응답을 기다리는 대신 어떤 일이 발생할 때 호출될 함수를 등록한다.

이러면 우리가 호출한 것을 논블로킹으로 만들 수 있다.

참고로, 라이언 달은 단순함과 저부하를 위해 콜백을 지지한다.


물론, 비동기 애플리케이션이 의존하는 이벤트 루프가 인터럽트, 스레드, 폴ㄹ링, 백 그라운드 프로세스등 이용해서 여러 동시성 요청이 진행되고, 궁극적으로 완료될 수 있게 보장해주는 기반 구조를 사용할 수 있을 때만 콜백을 사용할 수 있다. 이벤트 루프가 응답을 받으면, 우리 코드를 다시 호출하고, 우리가 실수만 하지 않는다면 이벤트 루프와 우리 애플리케셔인 코드가 공유하는 단일 스레드는 결코 블로킹 되지 않는다.


그러므로, 코루틴으로 사용될 경우 제너레이터는 비동기 프로그래밍을 할 수 있는 대안을 제시하고, 이벤트 루프의 관점에서 보면, 콜백을 호출하는 작업이나 중단된 코루틴의 send() 메서드를 호출하는 작업은 거의 같고, 중단된 코루틴마다 메모리 부하가 있기는 하지만, 스레드에 의한 부하보다 비교할 수 없을 만큼 적고, "콜백 지옥"도 없다.
profile
성장을 도울 아카이빙 블로그

0개의 댓글