Python

확장

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_futureloop.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() 실행 직후에 함수를 호출합니다.

분실물 보관소