Практическая ситуация: detached-задачу создали из высокоприоритетной задачи без явного приоритета — унаследует ли она приоритет родителя?
Нет. Task.detached не наследует приоритет родительской задачи. Если приоритет не задан явно, у detached-задачи нет гарантии получить приоритет создавшей её задачи; её эффективный приоритет определяется правилами планировщика.
Модель конкурентности Swift разделяет структурированные задачи, связанные с родительским контекстом, и независимые задачи. Task.detached предназначена для запуска работы, которая не должна автоматически наследовать контекст вызывающей задачи, включая изоляцию, task-local значения и приоритет.
Это позволяет явно отделять независимую фоновую работу от текущей цепочки выполнения, но одновременно лишает разработчика удобного автоматического наследования контекста.
Предположим, высокоприоритетная задача обрабатывает пользовательское действие и запускает тяжёлую detached-задачу. Ошибочно ожидать, что вычисление автоматически сохранит высокий приоритет.
В результате фоновая работа может выполняться с другим эффективным приоритетом. Обратная ошибка тоже опасна: нельзя рассчитывать, что detached-задача сама станет высокоприоритетной только потому, что её создали из срочной операции.
Обычная Task наследует часть контекста родительской задачи, в том числе приоритет, если он явно не переопределён. Task.detached создаёт независимую задачу и не выполняет такое наследование.
Если приоритет важен, его нужно задать явно при создании detached-задачи. Даже тогда приоритет является подсказкой планировщику, а не гарантией немедленного запуска или непрерывного выполнения: задача может приостанавливаться, вытесняться и конкурировать с другими задачами.
Отсутствие наследования приоритета не означает привязку к отдельному потоку. Swift планирует задачи на доступных исполнителях, а приоритет влияет на планирование, но не превращает задачу в строго realtime-механизм.
Практическое правило: Task.detached выбирают только при осознанной необходимости независимого контекста. Если работа логически принадлежит текущей операции и должна сохранять её приоритет, отмену или изоляцию, обычно предпочтительнее обычная Task или структурированная дочерняя задача.
Сервис обработки изображений получает пользовательский запрос на MainActor и запускает длительное вычисление. Рассматривались два варианта.
Обычная Task сохраняет связь с родительским контекстом и удобна для отмены вместе с операцией, но может унаследовать нежелательную изоляцию или контекст вызывающего кода. Task.detached лучше отделяет тяжёлое вычисление от MainActor, однако не наследует приоритет и требует явно передавать безопасные для конкурентного доступа данные.
Выбран вариант с detached-задачей и явно заданным приоритетом, поскольку вычисление действительно независимо от UI. Результат возвращается через безопасный конкурентный интерфейс, а ожидания относительно приоритета остаются вероятностными: приложение не считает его строгой гарантией времени выполнения.
Нет. Независимость Task.detached распространяется и на отмену: отмена родительской задачи автоматически не отменяет detached-задачу. Если такая связь нужна, её необходимо организовать явно, например передать сигнал отмены или выбрать структурированную модель дочерней задачи.
Нет. Приоритет — это рекомендация планировщику, а не обещание немедленного запуска. Задача всё равно может ждать доступного ресурса, быть вытеснена или уступить место другим задачам согласно правилам планирования системы.
Нет. Она не наследует actor isolation родительского контекста. Доступ к изолированному состоянию нужно выполнять через предусмотренные границы изоляции, а передаваемые значения должны удовлетворять требованиям конкурентной безопасности, обычно через Sendable или безопасную ссылку на actor.