Awaitable 객체

await 키워드로 실행하는 코루틴, 퓨처, 태스크를 의미한다.

awaitable 객체는 다음과 같이 정의한다.

  • 코루틴 이거나
  • 이터레이터를 반환하는 _await_() 메소드를 구현한 객체

퓨처는 이벤트 루프와 상호작용하는 객체로 작업 실행 상태와 결과를 저장한다.

  • 상태는 1) PENDING, 2) CANCELLED, 3) FINISHED 의 세가지이며, CANCELLED 와 FINISHED는 완료 상태이다
  • 결과 값을 저장(.set_result(value))하고 가져올(.result()) 수 있다.
  • 실행 중 취소(.cancel()) 할 수 있다.
  • .add_done_callback() 으로 완료 후 호출할 콜백을 등록할 수 있다.

태스크는 퓨처의 서브클래스로 퓨처 인터페이스에 더해 코루틴과 상호작용하는 역할을 한다. 내부에 코루틴 객체를 저장(_coro)하고 해당 코루틴(또는 코루틴 체인)의 실행을 개시한 후 결과를 받아올 수 있다. 이는 이벤트 루프를 통하여 진행되는데, 태스크가 이벤트 루프에 코루틴을 실행하도록 예약하는 방식이다.

  • asyncio.run(coro) 이나 asyncio.create_task(coro) 를 호출하여 태스크 객체를 생성하고, 이벤트 루프에 코루틴을 예약한다.
  • 코루틴을 실행 중 await가 필요한 코드(ex. asyncio.sleep())를 만나면 태스크는 실행을 중단하고 이벤트 루프에 제어를 넘긴다. 이벤트 루프는 예약된 태스크 중 우선 순위가 높은 것을 선택하여 실행을 재개한다.
  • 코루틴의 실행을 완료하면 그 반환 값을 태스크 결과 값으로 업데이트한다. 즉, 태스크 상태가 FINISHED로 변한다.

refs