From 996859a90df51f84eab47351702cb59c6db4428a Mon Sep 17 00:00:00 2001 From: Yury Selivanov Date: Tue, 25 Sep 2018 14:51:21 -0400 Subject: [PATCH] bpo-34790: [docs] Passing coroutines to asyncio.wait() can be confusing. (GH-9543) --- Doc/library/asyncio-task.rst | 40 +++++++++++++++++-- .../2018-09-24-12-47-08.bpo-34790.G2KXIH.rst | 1 + 2 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Documentation/2018-09-24-12-47-08.bpo-34790.G2KXIH.rst diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst index e995fb6391..bb693d7a64 100644 --- a/Doc/library/asyncio-task.rst +++ b/Doc/library/asyncio-task.rst @@ -472,14 +472,20 @@ Waiting Primitives return_when=ALL_COMPLETED) Run :ref:`awaitable objects ` in the *aws* - sequence concurrently and block until the condition specified + set concurrently and block until the condition specified by *return_when*. If any awaitable in *aws* is a coroutine, it is automatically - scheduled as a Task. + scheduled as a Task. Passing coroutines objects to + ``wait()`` directly is deprecated as it leads to + :ref:`confusing behavior `. Returns two sets of Tasks/Futures: ``(done, pending)``. + Usage:: + + done, pending = await asyncio.wait(aws) + The *loop* argument is deprecated and scheduled for removal in Python 4.0. @@ -514,9 +520,35 @@ Waiting Primitives Unlike :func:`~asyncio.wait_for`, ``wait()`` does not cancel the futures when a timeout occurs. - Usage:: + .. _asyncio_example_wait_coroutine: + .. note:: - done, pending = await asyncio.wait(aws) + ``wait()`` schedules coroutines as Tasks automatically and later + returns those implicitly created Task objects in ``(done, pending)`` + sets. Therefore the following code won't work as expected:: + + async def foo(): + return 42 + + coro = foo() + done, pending = await asyncio.wait({coro}) + + if coro in done: + # This branch will never be run! + + Here is how the above snippet can be fixed:: + + async def foo(): + return 42 + + task = asyncio.create_task(foo()) + done, pending = await asyncio.wait({task}) + + if task in done: + # Everything will work as expected now. + + Passing coroutine objects to ``wait()`` directly is + deprecated. .. function:: as_completed(aws, \*, loop=None, timeout=None) diff --git a/Misc/NEWS.d/next/Documentation/2018-09-24-12-47-08.bpo-34790.G2KXIH.rst b/Misc/NEWS.d/next/Documentation/2018-09-24-12-47-08.bpo-34790.G2KXIH.rst new file mode 100644 index 0000000000..dc3de2c7d4 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2018-09-24-12-47-08.bpo-34790.G2KXIH.rst @@ -0,0 +1 @@ +Document how passing coroutines to asyncio.wait() can be confusing. -- 2.40.0