Start here. This is the direct spoken answer to practice first.
Overview
Compares structured task ownership with ordered result aggregation and different failure behavior.
gather() runs awaitables concurrently and returns results in the same order as its inputs. By default, one raised exception is propagated to the waiter, but other submitted tasks are not automatically cancelled just because that member failed. TaskGroup creates a structured scope: when a child fails with an unhandled non-cancellation exception, it cancels the remaining children, waits for them, and reports grouped failures when the scope exits.