diff options
author | Yury Selivanov <yury@magic.io> | 2018-09-25 18:51:21 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-09-25 18:51:21 (GMT) |
commit | 996859a90df51f84eab47351702cb59c6db4428a (patch) | |
tree | dc8133137515934b27a8be799eb392c945b3b271 | |
parent | 22ef31d0b4b497eda5e356528c3e1d29584d6757 (diff) | |
download | cpython-996859a90df51f84eab47351702cb59c6db4428a.zip cpython-996859a90df51f84eab47351702cb59c6db4428a.tar.gz cpython-996859a90df51f84eab47351702cb59c6db4428a.tar.bz2 |
bpo-34790: [docs] Passing coroutines to asyncio.wait() can be confusing. (GH-9543)
-rw-r--r-- | Doc/library/asyncio-task.rst | 40 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Documentation/2018-09-24-12-47-08.bpo-34790.G2KXIH.rst | 1 |
2 files changed, 37 insertions, 4 deletions
diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst index e995fb6..bb693d7 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 <asyncio-awaitables>` 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 <asyncio_example_wait_coroutine>`. 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 0000000..dc3de2c --- /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. |