정책¶
경고
정책(Policies)은 더 이상 권장되지 않으며 Python 3.16에서 제거될 예정입니다. 사용자는 원하는 루프 구현을 사용하려면 asyncio.run() 함수나 loop_factory 를 포함한 asyncio.Runner 를 사용하는 것이 좋습니다.
이벤트 루프 정책은 현재의 이벤트 루프 를 가져오고 설정하며, 새로운 이벤트 루프를 생성하는 데 사용되는 전역 객체입니다. 기본 정책은 다른 이벤트 루프 구현을 사용하기 위해 내장 대체 옵션 으로 교체하거나, 또는 이러한 동작들을 재정의할 수 있는 사용자 정의 정책 로 대체될 수 있습니다.
정책 객체 는 컨텍스트 마다 별도의 이벤트 루프를 가져오고 설정합니다. 기본적으로 컨텍스트는 스레드 단위로 처리되지만, 사용자 정의 정책을 통해 컨텍스트 를 다르게 정의할 수 있습니다.
사용자 정의 이벤트 루프 정책은 get_event_loop(), set_event_loop() 및 new_event_loop()의 동작을 제어할 수 있습니다.
정책 객체는 AbstractEventLoopPolicy 추상 베이스 클래스에 정의된 API를 구현해야 합니다.
정책을 얻고 설정하기¶
다음 함수는 현재 프로세스의 정책을 가져오고 설정하는 데 사용할 수 있습니다:
- asyncio.get_event_loop_policy()¶
현재의 프로세스 전반의 정책을 돌려줍니다.
버전 3.14부터 폐지됨:
get_event_loop_policy()함수는 더 이상 권장되지 않으며 Python 3.16에서 제거될 예정입니다.
- asyncio.set_event_loop_policy(policy)¶
현재 프로세스 전반의 정책을 policy로 설정합니다.
policy를
None으로 설정하면, 기본 정책이 복원됩니다.버전 3.14부터 폐지됨:
set_event_loop_policy()함수는 더 이상 권장되지 않으며 Python 3.16에서 제거될 예정입니다.
정책 객체¶
추상 이벤트 루프 정책 베이스 클래스는 다음과 같이 정의됩니다:
- class asyncio.AbstractEventLoopPolicy¶
asyncio 정책의 추상 베이스 클래스.
- get_event_loop()¶
현재 컨텍스트의 이벤트 루프를 가져옵니다.
AbstractEventLoop인터페이스를 구현하는 이벤트 루프 객체를 반환합니다.이 메서드는 절대
None을 반환해서는 안 됩니다.버전 3.6에서 변경.
- set_event_loop(loop)¶
현재 컨텍스트에 대한 이벤트 루프를 loop로 설정합니다.
- new_event_loop()¶
새 이벤트 루프 객체를 만들고 반환합니다.
이 메서드는 절대
None을 반환해서는 안 됩니다.
버전 3.14부터 폐지됨:
AbstractEventLoopPolicy클래스는 더 이상 권장되지 않으며 Python 3.16에서 제거될 예정입니다.
asyncio에는 다음과 같은 내장 정책이 제공됩니다:
- class asyncio.DefaultEventLoopPolicy¶
기본 asyncio 정책. 유닉스에서는
SelectorEventLoop를, 윈도우에서는ProactorEventLoop를 사용합니다.수동으로 기본 정책을 설치할 필요는 없습니다. asyncio는 기본 정책을 자동으로 사용하도록 구성됩니다.
버전 3.8에서 변경: 윈도우에서, 이제 기본적으로
ProactorEventLoop가 사용됩니다.버전 3.14에서 변경: 기본 asyncio 정책의
get_event_loop()메서드는 이제 설정된 이벤트 루프가 없는 경우RuntimeError를 발생시킵니다.버전 3.14부터 폐지됨:
DefaultEventLoopPolicy클래스는 더 이상 권장되지 않으며 Python 3.16에서 제거될 예정입니다.
- class asyncio.WindowsSelectorEventLoopPolicy¶
SelectorEventLoop이벤트 루프 구현을 사용하는 대안 이벤트 루프 정책.가용성: Windows.
버전 3.14부터 폐지됨:
WindowsSelectorEventLoopPolicy클래스는 더 이상 권장되지 않으며 Python 3.16에서 제거될 예정입니다.
- class asyncio.WindowsProactorEventLoopPolicy¶
ProactorEventLoop이벤트 루프 구현을 사용하는 대안 이벤트 루프 정책.가용성: Windows.
버전 3.14부터 폐지됨:
WindowsProactorEventLoopPolicy클래스는 더 이상 권장되지 않으며 Python 3.16에서 제거될 예정입니다.
사용자 정의 정책¶
새로운 이벤트 루프 정책을 구현하려면, DefaultEventLoopPolicy의 서브 클래스를 만들고 사용자 정의 동작이 필요한 메서드를 재정의하는 것이 좋습니다, 예를 들어:
class MyEventLoopPolicy(asyncio.DefaultEventLoopPolicy):
def get_event_loop(self):
"""이벤트 루프를 가져옵니다.
None이거나 EventLoop의 인스턴스일 수 있습니다.
"""
loop = super().get_event_loop()
# loop로 무언가를 합니다 ...
return loop
asyncio.set_event_loop_policy(MyEventLoopPolicy())