bpo-34790: [docs] Passing coroutines to asyncio.wait() can be confusing. (GH-9543)
(cherry picked from commit 996859a90d
)
Co-authored-by: Yury Selivanov <yury@magic.io>
This commit is contained in:
parent
b2ae550298
commit
3cc9557d9f
|
@ -466,14 +466,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.
|
||||
|
||||
|
@ -508,9 +514,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)
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Document how passing coroutines to asyncio.wait() can be confusing.
|
Loading…
Reference in New Issue