gh-94972: document that shield users need to keep a reference to their task (GH-96724)

Co-authored-by: Thomas Grainger <tagrain@gmail.com>
Co-authored-by: Guido van Rossum <gvanrossum@gmail.com>
(cherry picked from commit 6281affee6)

Co-authored-by: Hendrik Makait <hendrik.makait@gmail.com>
This commit is contained in:
Miss Islington (bot) 2022-09-10 08:03:35 -07:00 committed by GitHub
parent 7033dc8adc
commit 335bd1ee8b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 23 additions and 7 deletions

View file

@ -55,7 +55,7 @@ Future Functions
preferred way for creating new Tasks.
Save a reference to the result of this function, to avoid
a task disappearing mid execution.
a task disappearing mid-execution.
.. versionchanged:: 3.5.1
The function accepts any :term:`awaitable` object.

View file

@ -254,9 +254,9 @@ Creating Tasks
.. important::
Save a reference to the result of this function, to avoid
a task disappearing mid execution. The event loop only keeps
a task disappearing mid-execution. The event loop only keeps
weak references to tasks. A task that isn't referenced elsewhere
may get garbage-collected at any time, even before it's done.
may get garbage collected at any time, even before it's done.
For reliable "fire-and-forget" background tasks, gather them in
a collection::
@ -520,7 +520,8 @@ Shielding From Cancellation
The statement::
res = await shield(something())
task = asyncio.create_task(something())
res = await shield(task)
is equivalent to::
@ -539,11 +540,19 @@ Shielding From Cancellation
the ``shield()`` function should be combined with a try/except
clause, as follows::
task = asyncio.create_task(something())
try:
res = await shield(something())
res = await shield(task)
except CancelledError:
res = None
.. important::
Save a reference to tasks passed to this function, to avoid
a task disappearing mid-execution. The event loop only keeps
weak references to tasks. A task that isn't referenced elsewhere
may get garbage collected at any time, even before it's done.
.. versionchanged:: 3.10
Removed the *loop* parameter.

View file

@ -848,7 +848,8 @@ def shield(arg):
The statement
res = await shield(something())
task = asyncio.create_task(something())
res = await shield(task)
is exactly equivalent to the statement
@ -864,10 +865,16 @@ def shield(arg):
If you want to completely ignore cancellation (not recommended)
you can combine shield() with a try/except clause, as follows:
task = asyncio.create_task(something())
try:
res = await shield(something())
res = await shield(task)
except CancelledError:
res = None
Save a reference to tasks passed to this function, to avoid
a task disappearing mid-execution. The event loop only keeps
weak references to tasks. A task that isn't referenced elsewhere
may get garbage collected at any time, even before it's done.
"""
inner = _ensure_future(arg)
if inner.done():