Какие способы многопоточности есть в Swift
Что проверяют
Знаете ли вы, чем сегодня пишут конкурентный код, и различаете ли «параллельно» и «асинхронно». Ответ уровня «есть GCD» показывает, что человек не открывал Swift Concurrency. Следом спрашивают про гонки и про @MainActor.
Как отвечать
Разложите по слоям, от современного к историческому.
- Swift Concurrency:
async/await,TaskиTaskGroup,async letдля параллельных запросов. Это не потоки, а задачи поверх кооперативного пула, размер которого равен числу ядер. Блокирующий вызов внутри задачи занимает поток пула и режет пропускную способность; - акторы:
actorсериализует доступ к своему состоянию,@MainActorпривязывает работу к главному потоку. Вместо ручного мьютекса корректность проверяет компилятор; Sendable: тип, который безопасно передавать между изоляциями. В языковом режиме Swift 6 нарушение это ошибка компиляции, а не редкий краш у пользователя. В Swift 6.2 добавили режим, где код по умолчанию изолирован на главном акторе, а уход в фон помечается через@concurrent;AsyncSequenceиAsyncStream: асинхронные потоки значений и мост от делегатов и колбэков кfor await;- GCD:
DispatchQueueпоследовательные и параллельные,DispatchGroup, барьеры для схемы «много читателей, один писатель», QoS вместо приоритетов потоков. В существующем коде живее всех живых; OperationиOperationQueue: зависимости между задачами, отмена,maxConcurrentOperationCount;Threadиos_unfair_lock: нижний уровень, в прикладном коде почти всегда лишний.
Назовите и инструменты: Thread Sanitizer с Main Thread Checker ловят гонки и обращения к UI из фона.
Где спотыкаются
Смешивают семафоры с await. DispatchSemaphore.wait() внутри асинхронной функции блокирует поток кооперативного пула и приводит к взаимной блокировке.
Считают, что Task { } уводит работу в фон. Он наследует изоляцию контекста, и внутри @MainActor останется на главном акторе. Для фона нужен Task.detached или вызов метода другого актора.
Заявляют, что async/await полностью заменил GCD. Очереди никуда не делись, а таймеры DispatchSourceTimer и работа с дескрипторами по-прежнему живут в GCD.