- Async functions run on the global executor by default, but can be instructed to run on the main actor using annotations like @MainActor. Using nonisolated allows escaping the main actor.
- Tasks are used to represent independent units of work but do not affect execution context. Unstructured tasks inherit context, detached tasks inherit nothing.
- Structured concurrency relates to the relationships between parent and child tasks. A parent task cannot complete until its children finish.