Использует ли функция задержки какой-либо диспетчер для разблокировки потока?
Не просто delay
. Все приостановленные функции взаимодействуют с диспетчером.
Вопрос, который вы должны задать: «Какой диспетчер здесь отвечает?»
И ответ таков: runBlocking
устанавливает свой собственный диспетчер, который отправляет поток, в который он вызван. И launch
, и async
в вашем коде наследуют его.
Имея это в виду:
Если я заменю задержку (1000) на блокирующий вызов, такой как сетевой запрос, то для вывода суммы на код потребуется около 10 секунд (каждый вызов занимает около 1 секунды)
Каждый блокирующий вызов будет удерживаться в одном потоке диспетчера. Он не сможет выполнять какую-либо другую работу, будучи заблокированным.
но если я заверну сетевой вызов в withContext
и использую диспетчер IO
, то для печати суммы потребуется 1 секунда, поскольку он выполняется в другом потоке
Да, это меняет диспетчера, проблема решена.
Итак, что делает delay
? Он приостанавливает текущую сопрограмму (запущенную async
) и возвращает управление диспетчеру, который теперь может возобновить цикл и запустить следующую сопрограмму.