Task {} не наследует отмену как дочерняя задача, а async let участвует в структурированной конкурентности и получает отмену родителя.
пусть родитель = Задача {
Task {} не наследует отмену как дочерняя задача, а async let участвует в структурированной конкурентности и получает отмену родителя.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
пусть родитель = Задача { пусть ребенок = Задача { print("ребенок запущен, isCancelled = ", Task.isCancelled) // NO false
для индекса в (1...[phone]) {
print(индекс)
}
print("ребенок завершен, isCancelled = ", Task.isCancelled) //
}
ожидать ребенок.значение
} попытка? ожидать Task.sleep(наносекунды: 1_000_000_000) // 1 секунда родитель.отменить()
///////
пусть родитель = Задача { асинхронно пусть ребенок: Пусто = { print("ребенок запущен, isCancelled =", Task.isCancelled)
для индекса в (1...[phone]) {
print(индекс)
}
print("ребенок завершен, isCancelled =", Task.isCancelled)
}()
ожидать ребенка
} попытка? ожидать Task.sleep(наносекунды: 1_000_000_000) // 1 секунда родитель.отменить()
Ответ
Task {} не наследует отмену как дочерняя задача, а async let участвует в структурированной конкурентности и получает отмену родителя.
Исходник машинно переведён и содержит [phone], поэтому точный вывод восстановить нельзя. В первом варианте внутренний Task {} не отменяется автоматически вызовом parent.cancel(). Во втором async let создаёт структурированного ребёнка: отмена распространяется на него. Однако отмена кооперативна и не прерывает обычный CPU-цикл. Значение последнего isCancelled зависит от того, успел ли цикл завершиться до отмены; для реакции нужны Task.checkCancellation() или проверка флага внутри работы.
Источник: github.com.