Skip to content

Commit

Permalink
gh-94972: document that shield users need to keep a reference to thei…
Browse files Browse the repository at this point in the history
…r task (#96724)

Co-authored-by: Thomas Grainger <tagrain@gmail.com>
Co-authored-by: Guido van Rossum <gvanrossum@gmail.com>
  • Loading branch information
3 people authored Sep 10, 2022
1 parent 50a70a0 commit 6281aff
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 7 deletions.
2 changes: 1 addition & 1 deletion Doc/library/asyncio-future.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
17 changes: 13 additions & 4 deletions Doc/library/asyncio-task.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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::

Expand Down Expand Up @@ -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::

Expand All @@ -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.

Expand Down
11 changes: 9 additions & 2 deletions Lib/asyncio/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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():
Expand Down

0 comments on commit 6281aff

Please sign in to comment.