]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-88831: In docs for asyncio.create_task, explain why strong references to tasks...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Tue, 7 Jun 2022 10:14:25 +0000 (03:14 -0700)
committerGitHub <noreply@github.com>
Tue, 7 Jun 2022 10:14:25 +0000 (12:14 +0200)
Co-authored-by: Ɓukasz Langa <lukasz@langa.pl>
(cherry picked from commit 75ceae05c11461beda65e6170b67b0b42fd55cd0)

Co-authored-by: Andreas Grommek <76997441+agrommek@users.noreply.github.com>
Doc/library/asyncio-task.rst
Misc/NEWS.d/next/Documentation/2022-05-26-14-51-25.gh-issue-88831.5Cccr5.rst [new file with mode: 0644]

index dc09286e5f852deabbf35108be022f67ec13296d..e535a5bf0425428f1a254435a2c0eb7026cd1613 100644 (file)
@@ -262,7 +262,24 @@ Creating Tasks
    .. important::
 
       Save a reference to the result of this function, to avoid
-      a task disappearing mid execution.
+      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.
+      For reliable "fire-and-forget" background tasks, gather them in
+      a collection::
+
+          background_tasks = set()
+
+          for i in range(10):
+              task = asyncio.create_task(some_coro(param=i))
+
+              # Add task to the set. This creates a strong reference.
+              background_tasks.add(task)
+
+              # To prevent keeping references to finished tasks forever,
+              # make each task remove its own reference from the set after
+              # completion:
+              task.add_done_callback(background_tasks.discard)
 
    .. versionadded:: 3.7
 
diff --git a/Misc/NEWS.d/next/Documentation/2022-05-26-14-51-25.gh-issue-88831.5Cccr5.rst b/Misc/NEWS.d/next/Documentation/2022-05-26-14-51-25.gh-issue-88831.5Cccr5.rst
new file mode 100644 (file)
index 0000000..983bea9
--- /dev/null
@@ -0,0 +1 @@
+Augmented documentation of asyncio.create_task(). Clarified the need to keep strong references to tasks and added a code snippet detailing how to to this.