Python 3.11 has its own concept of a task group, but the mechanics are quite a bit different. What sets any IO task groups apart from async IO task groups is the way cancellation is done. Cancellation is not done on a per test basis, but on a per cancel scope basis. You can have cancel scopes nested. So if you start a task and it starts cancel scope, you can just cancel that scope and it cancels everything up to that point.