The ``async with`` statement will wait for all tasks in the group to finish.
While waiting, new tasks may still be added to the group
(for example, by passing ``tg`` into one of the coroutines
-and calling ``tg.create_task()`` in that coroutine). There is also opportunity
-to short-circuit the entire task group with ``tg.cancel()``, based on some condition.
+and calling ``tg.create_task()`` in that coroutine). There is also opportunity to
+request termination of the entire task group with ``tg.cancel()``, based on some condition.
Once the last task has finished and the ``async with`` block is exited,
no new tasks may be added to the group.
(Contributed by Stan Ulbrych in :gh:`148981`.)
+asyncio
+-------
+
+* Added :meth:`TaskGroup.cancel <asyncio.TaskGroup.cancel>` to allow early
+ termination of a task group, for instance, when the goal of the tasks has
+ been achieved or their services are no longer needed.
+ Previously this would involve unintuitive boilerplate such as an extra task
+ raising a custom exception which is then suppressed as it exits the task group.
+ (Contributed by John Belmonte in :gh:`127214`.)
+
+
base64
------