summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@redhat.com>2018-09-25 15:27:08 (GMT)
committerYury Selivanov <yury@magic.io>2018-09-25 15:27:08 (GMT)
commit6ea29c5e90dde6c240bd8e0815614b52ac307ea1 (patch)
treeb13f44020dc742f6d06d8adb71961b734b06c2ea
parentc8c0249c9e8f61ab7670119a5a5278354df27bbb (diff)
downloadcpython-6ea29c5e90dde6c240bd8e0815614b52ac307ea1.zip
cpython-6ea29c5e90dde6c240bd8e0815614b52ac307ea1.tar.gz
cpython-6ea29c5e90dde6c240bd8e0815614b52ac307ea1.tar.bz2
bpo-34687: Make asynico use ProactorEventLoop by default (GH-9538)
-rw-r--r--Doc/library/asyncio-platforms.rst16
-rw-r--r--Doc/library/asyncio-policy.rst14
-rw-r--r--Doc/whatsnew/3.8.rst5
-rw-r--r--Lib/asyncio/windows_events.py2
-rw-r--r--Lib/test/test_asyncio/test_base_events.py2
-rw-r--r--Lib/test/test_asyncio/test_streams.py3
-rw-r--r--Misc/NEWS.d/next/Library/2018-09-24-17-14-57.bpo-34687.Fku_8S.rst2
7 files changed, 30 insertions, 14 deletions
diff --git a/Doc/library/asyncio-platforms.rst b/Doc/library/asyncio-platforms.rst
index f8ecb58..81d840e 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()
<AbstractEventLoopPolicy.set_child_watcher>` function is also
diff --git a/Doc/library/asyncio-policy.rst b/Doc/library/asyncio-policy.rst
index 42f936d..560f8b3 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 e37a70f..89764c8 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 fdde8e9..772ddf4 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 fe3c383..95f4f6b 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 d8e3715..c529e52 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 0000000..0e203c4
--- /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.