Python

확장

asyncio 를 확장하는 주요 방향은 커스텀 이벤트 루프(event loop) 클래스를 작성하는 것입니다. asyncio에는 이 작업을 간소화하는 데 사용할 수 있는 도우미 기능들이 포함되어 있습니다.

참고

제3자 개발자는 기존의 asyncio 코드를 주의해서 재사용해야 합니다. 새로운 파이썬 버전에서는 API의 내부(internal) 부분에 대한 하위 호환성을 깨뜨릴 수 있습니다.

커스텀 이벤트 루프 작성하기

asyncio.AbstractEventLoop 은 매우 많은 메서드를 선언합니다. 이를 처음부터 모두 구현하는 것은 번거로운 작업입니다.

루프는 asyncio.BaseEventLoop 를 상속함으로써 많은 일반적인 메서드 구현을 자동으로 얻을 수 있습니다.

대신 상속받은 클래스는 asyncio.BaseEventLoop 에서 선언되었으나 구현되지 않은 일련의 내부(private) 메서드들을 구현해야 합니다.

예를 들어, loop.create_connection()``은 인자를 확인하고 DNS 주소를 해결하며 상속받은 클래스에서 구현되어야 하는 ``loop._make_socket_transport()``를 호출합니다. ``_make_socket_transport() 메서드는 문서화되지 않았으며 내부(internal) API로 간주됩니다.

Future 및 Task 내부 생성자

asyncio.Futureasyncio.Task 는 직접 생성해서는 안 되며, 대신 해당되는 loop.create_future()loop.create_task(), 또는 asyncio.create_task() 팩토리를 사용하십시오.

그러나 제3자 이벤트 루프 는 복잡하고 고도로 최적화된 코드를 그대로 활용하기 위해 내장된 퓨처(future) 및 태스크(task) 구현을 재사용 할 수 있습니다.

이 목적을 위해 다음과 같은 내부(private) 생성자들이 나열됩니다.

Future.__init__(*, loop=None)

내장된 퓨처 인스턴스를 생성합니다.

loop 은 선택적인 이벤트 루프 인스턴스입니다.

Task.__init__(coro, *, loop=None, name=None, context=None)

내장된 태스크 인스턴스를 생성합니다.

loop 은 선택적인 이벤트 루프 인스턴스입니다. 나머지 인자는 loop.create_task() 설명에 기술되어 있습니다.

버전 3.11에서 변경: context 인자가 추가되었습니다.

태스크 수명 지원

제3자 태스크 구현은 다음 함수들을 호출하여 asyncio.all_tasks()asyncio.current_task() 에서 해당 태스크가 인식되도록 해야 합니다.

asyncio._register_task(task)

asyncio 에 의해 관리되는 새로운 태스크 를 등록합니다.

태스크 생성자에서 해당 함수를 호출합니다.

asyncio._unregister_task(task)

asyncio 내부 구조에서 태스크 를 등록 해제합니다.

태스크가 종료되기 직전에 이 함수를 호출해야 합니다.

asyncio._enter_task(loop, task)

현재 태스크를 task 인자로 전환합니다.

내장된 코루틴 의 일부( coroutine.send() 또는 coroutine.throw() )를 실행하기 직전에 이 함수를 호출합니다.

asyncio._leave_task(loop, task)

현재 태스크를 task 에서 None 으로 다시 전환합니다.

coroutine.send() 또는 coroutine.throw() 실행 직후에 함수를 호출합니다.

분실물 보관소