원인
Python 3.8 이후 부터, 윈도우는 타 운영체제랑 다른 EventLoop를 기본 값으로 활용한다고 한다.
- 타 OS 기본 :
SelectorEventLoop
- 윈도우 기본 :
ProactorEventLoop
해결 방법
아래 코드를 입력해, 윈도우의 EventLoop를 SelectorEventLoop
로 변경하면 된다.
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
주의 사항
윈도우는 I/O Completion Ports를 활용해 비동기 처리 하기 때문에, SelectorEventLoop
로 변경 시 아래와 같은 제약이 있다고 한다. 제약이 문제가 될 경우, Trio 라는 별도의 라이브러리를 사용하는 것이 좋다고 한다.
- Can't support more than 512 sockets
- Can't use pipe
- Can't use subprocesses
참고
- Asyncio의 문제와 해결법이 잘 설명돼있다.
- 윈도우에서 asyncio를 사용할 때 제약 사항들이 나와있다.