From 3f5018459f507353ba2c01fca871e2df0d8ac0a1 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 2 Oct 2018 09:55:37 +0200 Subject: [PATCH] Proactor policy fix (#17066) * Proactor policy fix * Backport Proactor policy for 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: