Как работает асинхронность в корутинах? Да и вообще многопоточность в целом
Корутины как я понимаю это что-то вроде то как работает многопоточность в одноядерном процессоре, а одноядерный процессор в моем понимании если выполняя какие нибудь процессы последовательно займет скажем 5 секунд то столько же времени займет выполняя асинхронно.
Так вот:
1.Почему код ниже заняло всего 1 секунду на компиляцию вместо 2?
2.Под капотом корутины задачи по потокам распределяют или что?
3.Если да то что это значит, в восьмиядерном процессоре можно только 8 процессов одновременно вполнять?
fun main() = runBlocking<Unit> {
val time = measureTimeMillis {
val one = async { doSomethingUsefulOne() }
val two = async { doSomethingUsefulTwo() }
println("The answer is ${one.await() + two.await()}")
}
println("Completed in $time ms")
}
suspend fun doSomethingUsefulOne(): Int {
delay(1000L) // pretend we are doing something useful here
return 13
}
suspend fun doSomethingUsefulTwo(): Int {
delay(1000L) // pretend we are doing something useful here, too
return 29
}
Ответы (1 шт):
Смотрите.
Корутины работают как "многопточность по современному", очень похоже на многопоточность в Golang, C# и т.п. - все языки, где есть async-await, работают примерно похоже.
Они основываются на том, что называется state machine (или, в переводе на русский часто - "машина состояний").
Фактически, такая мнопоточность объединяет пул тредов и "планировщик", который легковесные "задачи" распределяет по тредам. Единицей планирования в этом случае является "задача". Для работы с "задачами" есть методы async-await.
Теперь - очень коротко, переведем на человеческий язык выражение
val one = async { doSomethingUsefulOne() }
Здесь вы говорите:
"запусти задачу doSomethingUsefulOne() и работай себе дальше". Поэтому при запуске этой задачи код продолжает работать дальше, и НЕМЕДЛЕННО запускает вторую задачу.
Обе эти задачи работают прараллельно, и когда они выполняются обе- Ваша программа завершается. Программа выполняется за 1 секунду именно из за параллельной работы этих задач.
"Под капотом корутины задачи по потокам распределяют или что?" - да, "под капотом" задачи респределяют по тредам, используя алгоритмы, которые немного по разному работают для задач с интенсивными вычислениями и с интенсивным ввводом -выводом. Но этим можно не забивать себе голову, важно помнить, что задач с интенсивным вводом - выводом может быть много, а вот задачи, активно нагружающие процессор, не смогут работать "на полную скорость" в количестве, превышающем кол-во ядер процессора. Ну, то есть, для них ядра - это ресурс, за который они конкурируют.
Нет. Во первых, в любой современной системе кол-во одновременных процессов гораздо болше кол-ва ядер.
Во вторых, "вытесняющая многозадачность" и "квантование времени", которые спасали нас во воремена одноядерных процессоров - никуда не делись, и по прежнему работают. Просто сейчас упор делается на эффективную организацию параллельной работы многих тредов на многих ядрах - ну, чтобы не происходило лишнего переключения контекстов, лишних локов и т.п. И чтобы от callback'ов не происходил "заворот мозга" у разработчиков.
Всё это - достаточно общие слова, но во первых - и вопрос тоже был довольно общим. Кроме того, у Вас теперь есть несколько терминов для дальнейшего гугления. Ну, и, конечно же, можно задать уточняющие вопросы или отредактировать исходный вопрос!