From 6ea29c5e90dde6c240bd8e0815614b52ac307ea1 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 25 Sep 2018 08:27:08 -0700 Subject: [PATCH] bpo-34687: Make asynico use ProactorEventLoop by default (GH-9538) --- Doc/library/asyncio-platforms.rst | 16 ++++++---------- Doc/library/asyncio-policy.rst | 14 +++++++++++++- Doc/whatsnew/3.8.rst | 5 +++++ Lib/asyncio/windows_events.py | 2 +- Lib/test/test_asyncio/test_base_events.py | 2 +- Lib/test/test_asyncio/test_streams.py | 3 ++- .../2018-09-24-17-14-57.bpo-34687.Fku_8S.rst | 2 ++ 7 files changed, 30 insertions(+), 14 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2018-09-24-17-14-57.bpo-34687.Fku_8S.rst diff --git a/Doc/library/asyncio-platforms.rst b/Doc/library/asyncio-platforms.rst index f8ecb58d3a..81d840e232 100644 --- a/Doc/library/asyncio-platforms.rst +++ b/Doc/library/asyncio-platforms.rst @@ -23,6 +23,10 @@ All Platforms Windows ======= +.. versionchanged:: 3.8 + + On Windows, :class:`ProactorEventLoop` is now the default event loop. + All event loops on Windows do not support the following methods: * :meth:`loop.create_unix_connection` and @@ -67,16 +71,8 @@ Windows configuration. Subprocess Support on Windows ----------------------------- -:class:`SelectorEventLoop` on Windows does not support subproceses. -On Windows, :class:`ProactorEventLoop` should be used instead:: - - import asyncio - - asyncio.set_event_loop_policy( - asyncio.WindowsProactorEventLoopPolicy()) - - asyncio.run(your_code()) - +On Windows, the default event loop :class:`ProactorEventLoop` supports +subprocesses, whereas :class:`SelectorEventLoop` does not. The :meth:`policy.set_child_watcher() ` function is also diff --git a/Doc/library/asyncio-policy.rst b/Doc/library/asyncio-policy.rst index 42f936da46..560f8b3135 100644 --- a/Doc/library/asyncio-policy.rst +++ b/Doc/library/asyncio-policy.rst @@ -92,11 +92,23 @@ asyncio ships with the following built-in policies: .. class:: DefaultEventLoopPolicy The default asyncio policy. Uses :class:`SelectorEventLoop` - on both Unix and Windows platforms. + on Unix and :class:`ProactorEventLoop` on Windows. There is no need to install the default policy manually. asyncio is configured to use the default policy automatically. + .. versionchanged:: 3.8 + + On Windows, :class:`ProactorEventLoop` is now used by default. + + +.. class:: WindowsSelectorEventLoopPolicy + + An alternative event loop policy that uses the + :class:`SelectorEventLoop` event loop implementation. + + Availability: Windows. + .. class:: WindowsProactorEventLoopPolicy diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index e37a70f32d..89764c8cd2 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -116,6 +116,11 @@ New Modules Improved Modules ================ +asyncio +------- + +On Windows, the default event loop is now :class:`~asyncio.ProactorEventLoop`. + os.path ------- diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py index fdde8e9e0b..772ddf4dfe 100644 --- a/Lib/asyncio/windows_events.py +++ b/Lib/asyncio/windows_events.py @@ -811,4 +811,4 @@ class WindowsProactorEventLoopPolicy(events.BaseDefaultEventLoopPolicy): _loop_factory = ProactorEventLoop -DefaultEventLoopPolicy = WindowsSelectorEventLoopPolicy +DefaultEventLoopPolicy = WindowsProactorEventLoopPolicy diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py index fe3c38371d..95f4f6b82d 100644 --- a/Lib/test/test_asyncio/test_base_events.py +++ b/Lib/test/test_asyncio/test_base_events.py @@ -1014,7 +1014,7 @@ class BaseEventLoopWithSelectorTests(test_utils.TestCase): def setUp(self): super().setUp() - self.loop = asyncio.new_event_loop() + self.loop = asyncio.SelectorEventLoop() self.set_event_loop(self.loop) @mock.patch('socket.getnameinfo') diff --git a/Lib/test/test_asyncio/test_streams.py b/Lib/test/test_asyncio/test_streams.py index d8e371510d..c529e5208c 100644 --- a/Lib/test/test_asyncio/test_streams.py +++ b/Lib/test/test_asyncio/test_streams.py @@ -816,7 +816,8 @@ os.close(fd) addr = q.get() # Should not be stuck in an infinite loop. - with self.assertRaises((ConnectionResetError, BrokenPipeError)): + with self.assertRaises((ConnectionResetError, ConnectionAbortedError, + BrokenPipeError)): self.loop.run_until_complete(client(*addr)) # Clean up the thread. (Only on success; on failure, it may diff --git a/Misc/NEWS.d/next/Library/2018-09-24-17-14-57.bpo-34687.Fku_8S.rst b/Misc/NEWS.d/next/Library/2018-09-24-17-14-57.bpo-34687.Fku_8S.rst new file mode 100644 index 0000000000..0e203c4f27 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-09-24-17-14-57.bpo-34687.Fku_8S.rst @@ -0,0 +1,2 @@ +On Windows, asyncio now uses ProactorEventLoop, instead of +SelectorEventLoop, by default. -- 2.49.0