Выбор ответа Senior GCD и OperationQueue обновлено
Thread explosion в GCD
Вопрос
Код отправляет 500 блоков в DispatchQueue.global().async, и каждый блокируется на синхронном сетевом вызове. Что произойдёт?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: GCD будет поднимать новые потоки вместо заблокированных до лимита. Когда рабочий поток блокируется, GCD считает ядро свободным и поднимает новый поток.
Варианты ответа
- GCD будет поднимать новые потоки вместо заблокированных до лимитаправильный ответ
- GCD выполнит столько блоков, сколько ядер, остальные просто подождут
- Приложение упадёт: глобальная очередь принимает не больше 64 блоков
- Блоки автоматически станут асинхронными, и блокировки не будет
Разбор
Когда рабочий поток блокируется, GCD считает ядро свободным и поднимает новый поток. При сотнях блокирующих задач получается взрыв потоков: каждый занимает стек, планировщик тратит время на переключения, а при исчерпании лимита потоков очереди встают. Лечится ограничением параллельности (OperationQueue.maxConcurrentOperationCount, семафор), неблокирующими API или Swift Concurrency с кооперативным пулом.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «GCD и OperationQueue»
- Асинхронная Operation
- Барьер для потокобезопасного кеша
- Инверсия приоритетов
- DispatchSemaphore для ограничения параллельности
- DispatchWorkItem и отмена
- Как дождаться нескольких запросов в GCD
- Задача на Swift: операции с зависимостями и критический путь
- Задача на Swift: OperationQueue с ограничением параллельности