8.13. 루프 제어#
대부분의 asyncio 스크립트는 이벤트 루프를 직접 다루지 않습니다 – asyncio.run()으로 충분합니다. 이 페이지는 그것으로 충분하지 않은 경우, 즉 예외 핸들러를 설치하거나, run과 다른 생명 주기로 루프를 실행하거나, 계측을 위해 루프 객체를 보유하는 경우를 위한 Loop 표면을 다룹니다.
8.13.1. 루프 얻기#
asyncio.get_event_loop()–Loop객체를 반환합니다. 코루틴 내부에서든 외부에서든 안전하게 호출할 수 있습니다.asyncio.new_event_loop()– MicroPython에서는 새 루프를 생성하는 것이 아니라 기존 루프의 상태를 재설정합니다. 이 주의 사항은 반복할 가치가 있습니다: 프로그램당 이벤트 루프는 정확히 하나입니다.
Loop의 메서드와 asyncio.run() 외에 루프를 실행하는 API는 없습니다.
8.13.2. 루프를 직접 실행하기#
asyncio.run()은 거의 모든 애플리케이션에 적합한 진입점입니다. 그것으로 충분하지 않은 경우를 위해 두 개의 Loop 메서드가 존재합니다.
run_until_complete()– awaitable이 주어지면, 그 awaitable이 끝날 때까지 루프를 실행한 뒤 그 결과를 반환합니다. 단일asyncio.run()호출과 동등하되, 루프 해체 부분이 빠진 것입니다.run_forever()– 태스크 내부에서stop()이 호출될 때까지 루프를 실행합니다. 최상위 awaitable이 없으며, 애플리케이션은run_forever를 호출하기 전에asyncio.create_task()를 통해 필요한 것을 스케줄링해야 합니다.
동반 메서드로는 stop()(현재 태스크가 끝난 후 루프를 멈추도록 요청)과 close()(루프의 리소스를 해제)가 있습니다.
8.13.3. 루프 측 태스크 생성#
create_task()–asyncio.create_task()와 동일한 작업입니다. 자유 함수는 일반적인 경우에 애플리케이션 코드가 루프 참조를 필요로 하지 않도록 존재하고, 메서드는 이미 루프 참조를 가진 계측을 위해 존재합니다.
8.13.4. 예외 핸들러#
루프는 코루틴 호출 체인 어디에서도 잡히지 않은 예외를 태스크가 발생시켰을 때 핸들러를 호출합니다 – 전형적인 경우는 애플리케이션이 asyncio.create_task()로 생성하고 한 번도 await하지 않은 태스크입니다. 기본 핸들러는 sys.stderr를 통해 트레이스백을 출력합니다. 예외 페이지에서 이를 사용자 정의 핸들러로 교체하는 방법을 보여주었습니다.
set_exception_handler()– 사용자 정의 핸들러를 설치합니다. 핸들러는 호출 가능한handler(loop, context)이며, 여기서context는 최소한'message'를 포함하고 보통'exception'과'future'를 포함하는 dict입니다.get_exception_handler()– 현재 설치된 핸들러를 반환하거나, 기본 핸들러가 사용 중이면None을 반환합니다.default_exception_handler()– 내장 핸들러입니다. 기본 동작도 함께 실행하려는 사용자 정의 핸들러 내부에서 유용합니다(예를 들어 플래시에 로그를 남기는 동시에 트레이스백을 출력).call_exception_handler()– 직접 만든 context dict로 현재 설치된 핸들러를 실행합니다. 대부분 루프 자체가 사용하며, 애플리케이션이 필요로 하는 경우는 드뭅니다.