Выбор ответа Senior Swift Concurrency обновлено

Блокировка внутри async-кода

Вопрос

Почему внутри async-функции нельзя ждать результат через DispatchSemaphore.wait()?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Потоков в пуле около числа ядер: блокировка может всё повесить. Swift Concurrency выполняет задачи на кооперативном пуле, где потоков примерно столько, сколько ядер.

Варианты ответа

  1. Семафоры в Swift запрещены, компилятор их не пропустит
  2. Это лишь предупреждение стиля, работает так же, как await
  3. Потоков в пуле около числа ядер: блокировка может всё повеситьправильный ответ
  4. Семафор автоматически отменяет задачу, которая его ждёт

Разбор

Swift Concurrency выполняет задачи на кооперативном пуле, где потоков примерно столько, сколько ядер. Модель предполагает, что задачи не блокируют потоки, а уступают их на await. Если задача ждёт семафор, который должна освободить другая задача, а свободных потоков нет, всё зависнет. Правильно: await на async-API или continuation для callback-кода. Семафоры в GCD-коде допустимы, но мешать их с async/await нельзя.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.