diff --git a/homeassistant/__main__.py b/homeassistant/__main__.py index 91b7a7f8466..973080c2e61 100644 --- a/homeassistant/__main__.py +++ b/homeassistant/__main__.py @@ -22,16 +22,30 @@ from homeassistant.const import ( def set_loop() -> None: """Attempt to use uvloop.""" import asyncio + from asyncio.events import BaseDefaultEventLoopPolicy + + policy = None if sys.platform == 'win32': - asyncio.set_event_loop(asyncio.ProactorEventLoop()) + if hasattr(asyncio, 'WindowsProactorEventLoopPolicy'): + policy = asyncio.WindowsProactorEventLoopPolicy() + else: + class ProactorPolicy(BaseDefaultEventLoopPolicy): + """Event loop policy to create proactor loops.""" + + _loop_factory = asyncio.ProactorEventLoop + + policy = ProactorPolicy() else: try: import uvloop except ImportError: pass else: - asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) + policy = uvloop.EventLoopPolicy() + + if policy is not None: + asyncio.set_event_loop_policy(policy) def validate_python() -> None: diff --git a/homeassistant/util/async_.py b/homeassistant/util/async_.py index 61fbb60a24f..04456b8cb2f 100644 --- a/homeassistant/util/async_.py +++ b/homeassistant/util/async_.py @@ -2,7 +2,6 @@ import concurrent.futures import threading import logging -import sys from asyncio import coroutines from asyncio.events import AbstractEventLoop from asyncio.futures import Future @@ -23,10 +22,7 @@ except AttributeError: def asyncio_run(main: Awaitable[_T], *, debug: bool = False) -> _T: """Minimal re-implementation of asyncio.run (since 3.7).""" - if sys.platform == 'win32': - loop = asyncio.ProactorEventLoop() - else: - loop = asyncio.new_event_loop() + loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) loop.set_debug(debug) try: