asyncio Future, 콜백, Semaphore 구현까지! 비동기 프로그래밍의 핵심을 파헤칩니다.
by DD
4년 전
조회수 2
asyncio Future는 비동기 프로그래밍에서 결과를 저장하는 객체로, 콜백 등록 및 활용 가능
Future.add_done_callback()을 통해 Job 완료 시 총 수행 시간 출력 등 모니터링 기능 구현
Future 발행을 통해 Semaphore를 비동기적으로 구현하여 busy waiting 문제 해결
Future와 콜백의 동작 원리
asyncio Future는 비동기 연산의 결과를 관리하며, add_done_callback()을 통해 콜백 함수를 등록한다. 구체적으로, Future가 완료되면 Eventloop은 등록된 콜백을 실행한다. 따라서 콜백 함수는 Future의 상태 변화에 따라 동작을 수행하며, 비동기 프로그래밍의 핵심 패턴을 이룬다.
Semaphore 구현: Busy Waiting vs Future 발행
Busy waiting 방식은 CPU 자원 낭비를 초래하는 반면, Future 발행은 비동기적으로 Semaphore를 구현한다. 따라서 acquire()에서 Future를 생성하고, release()에서 Future를 완료하여 대기 큐를 관리한다. 결과적으로 CPU 사용률 감소와 성능 향상을 동시에 달성한다.
asyncio Future 활용 시 유의사항
Future 콜백의 실행 순서는 명세상 보장되지 않으므로, 순서 보장이 필요한 경우 별도의 장치가 필요하다. 구체적으로, loop.call_soon()을 사용하여 콜백 실행 시점을 제어할 수 있다. 반면, async 함수를 콜백으로 등록할 때는 asyncio.create_task()를 활용하여 Eventloop에 등록해야 한다.