Выбор ответа Senior Swift Concurrency обновлено
Блокировка внутри async-кода
Вопрос
Почему внутри async-функции нельзя ждать результат через DispatchSemaphore.wait()?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Потоков в пуле около числа ядер: блокировка может всё повесить. Swift Concurrency выполняет задачи на кооперативном пуле, где потоков примерно столько, сколько ядер.
Варианты ответа
- Семафоры в Swift запрещены, компилятор их не пропустит
- Это лишь предупреждение стиля, работает так же, как
await - Потоков в пуле около числа ядер: блокировка может всё повеситьправильный ответ
- Семафор автоматически отменяет задачу, которая его ждёт
Разбор
Swift Concurrency выполняет задачи на кооперативном пуле, где потоков примерно столько, сколько ядер. Модель предполагает, что задачи не блокируют потоки, а уступают их на await. Если задача ждёт семафор, который должна освободить другая задача, а свободных потоков нет, всё зависнет. Правильно: await на async-API или continuation для callback-кода. Семафоры в GCD-коде допустимы, но мешать их с async/await нельзя.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.