diff options
author | Hendrik Makait <hendrik.makait@gmail.com> | 2022-09-10 14:34:14 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-10 14:34:14 (GMT) |
commit | 6281affee6423296893b509cd78dc563ca58b196 (patch) | |
tree | be2b0090e709734cbfbdf85e0415773254ba2375 /Lib | |
parent | 50a70a083d34305a52fac4f5901bff2ead152d68 (diff) | |
download | cpython-6281affee6423296893b509cd78dc563ca58b196.zip cpython-6281affee6423296893b509cd78dc563ca58b196.tar.gz cpython-6281affee6423296893b509cd78dc563ca58b196.tar.bz2 |
gh-94972: document that shield users need to keep a reference to their task (#96724)
Co-authored-by: Thomas Grainger <tagrain@gmail.com>
Co-authored-by: Guido van Rossum <gvanrossum@gmail.com>
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/asyncio/tasks.py | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index 27fe58d..56a355c 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -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(): |