확장¶
asyncio 확장 및 개발의 주요 방향은 사용자 정의 이벤트 루프 클래스를 작성하는 것입니다. Asyncio에는 이 작업을 단순화하는 데 사용할 수 있는 헬퍼가 있습니다.
참고
서드 파티는 기존 asyncio 코드를 주의하여 재사용해야 합니다. 새로운 Python 버전은 API의 내부 부분의 하위 호환성을 깨도 자유롭습니다.
사용자 정의 이벤트 루프 작성¶
:class:`asyncio.AbstractEventLoop`는 매우 많은 메서드를 선언합니다. 이 모든 것을 처음부터 구현하는 것은 지루한 작업입니다.
루프는 :class:`asyncio.BaseEventLoop`을 상속함으로써 많은 일반적인 메서드 구현을 무료로 얻을 수 있습니다.
차례로, 후속 클래스는 :class:`asyncio.BaseEventLoop`에 선언되었지만 구현되지 않은 여러 private 메서드를 구현해야 합니다.
예를 들어, loop.create_connection()``은 인자를 확인하고, DNS 주소를 확인하며, 상속받은 클래스에서 구현해야 하는 ``loop._make_socket_transport()``를 호출합니다. 이 ``_make_socket_transport() 메서드는 문서화되어 있지 않으며 내부 API로 간주됩니다.
Future 및 Task private 생성자¶
asyncio.Future`와 :class:`asyncio.Task`는 직접 생성해서는 안 되며, 해당 :meth:`loop.create_future 및 loop.create_task() 또는 asyncio.create_task() 팩토리를 사용하십시오.
하지만, 서드파티 이벤트 루프 는 복잡하고 고도로 최적화된 코드를 무료로 얻기 위해 내장된 Future 및 Task 구현을 재사용 할 수 있습니다.
이 목적을 위해 다음 내부 생성자들이 나열되어 있습니다:
- Future.__init__(*, loop=None)¶
내장 Future 인스턴스를 생성합니다.
loop 는 선택적 이벤트 루프 인스턴스입니다.
- Task.__init__(coro, *, loop=None, name=None, context=None)¶
내장 Task 인스턴스를 생성합니다.
loop 는 선택적 이벤트 루프 인스턴스입니다. 나머지 인수는
loop.create_task()설명서에 설명되어 있습니다.버전 3.11에서 변경: context 인자가 추가되었습니다.
Task 생명주기 지원¶
서드파티 Task 구현은 asyncio.all_tasks() 및 :func:`asyncio.current_task`를 통해 Task가 보이는 상태를 유지하기 위해 다음과 같은 함수를 호출해야 합니다:
- asyncio._register_task(task)¶
asyncio 에 의해 관리되는 새로운 task 를 등록하십시오.
Task 생성자에서 함수를 호출합니다.
- asyncio._unregister_task(task)¶
asyncio 내부 구조에서 task 를 등록 취소합니다.
작업이 완료되기 직전에 함수를 호출해야 합니다.
- asyncio._enter_task(loop, task)¶
현재 Task를 task 인자로 전환합니다.
임베디드 coroutine (
coroutine.send()또는coroutine.throw()) 부분이 실행되기 직전에 함수를 호출합니다.
- asyncio._leave_task(loop, task)¶
현재 Task를 task 에서
None로 되돌립니다.coroutine.send()또는coroutine.throw()실행 직후에 함수를 호출합니다.