Ответ
Он выполняется в произвольном потоке из cooperative thread pool Swift Concurrency.
Ключевые принципы:
- Наследование контекста:
Taskнаследует актор-контекст места своего создания. Если он создан внеMainActor(в обычной синхронной функции), у него нет привязки к главному потоку. - Пул потоков: Система Swift Concurrency выбирает для выполнения тела
async-функции любой доступный поток из своего пула.
Пример:
// 1. Обычная синхронная функция, не изолированная к MainActor.
func startBackgroundWork() {
Task { // Эта задача НЕ привязана к MainActor.
// Код до `await` выполняется в потоке из пула (A).
print(Thread.current) // Не главный
await asyncOperation()
// Код после `await` может выполниться в том же или ДРУГОМ потоке из пула (B).
}
}
// 2. Async-функция, вызванная внутри задачи.
func asyncOperation() async {
// Выполняется в потоке из пула Swift Concurrency.
let result = await downloadData()
}
Как управлять потоком?
- Используйте
@MainActorдля гарантии выполнения на главном потоке. - Используйте глобальные акторы (
@GlobalActor) для собственных изолированных контекстов. Task.detachedявно создает задачу, не наследующую контекст родителя.