CPU, Memory Models, Concurrency, Multiprocess, Multithreading и Async. Часть 20. Golang.
Сегодня разбираем язык Go и то как в нем развивались примитивы для параллелизма и конкуррентности.
🔵 Сразу несколько фактов:
- В языке Go нет потоков в том смысле в котором вы видели в предыдущих постах (1-1 mapping на потоки ОС)
- В языке Go нет GIL и как следствие нет надобности писать многопроцессный код для достижения параллелизма, процессы скорее будут давать оверхэд чем пользу.
🔵 Что же есть в Go:
- Горутины - легковесные нити исполнения которыми управляем Go Runtime. Горутины реализуют M-N модель многопоточности. Подробнее об этой модели писал в посте. Такая модель позволяет достичь пареллелизма на многопроцессорном компьютере.
- Планировщик, который следит за горутинами и переключает их между собой для эффективной утилизации железа.
🔵 Планировщик. Как происходит переключение между горутинами?
В языке Go до версии 1.14 горутины были кооперативными, то есть если горутина завладевала потоком и не отпускала владение (пример - долгий цикл обсчитывающий какой нибудь интеграл) то мы могли заблокироать всю программу.
С версии 1.14 планировщик стал вытесняющим и переключение горутин стало автоматическим, вне зависимости от того чем занимается горутина, CPU или IO задачами. Слайс времени переключения - 10ms.
В этом смысле Go очень выделяется среди языков программирования, особенно среди тех которые я обозревал ранее. В Python, Ruby, Java реализации легковесных потоков кооперативные, то есть переключения происходят только если в коде есть инструкция или поток заблокировался об IO.
🔵Ограничение параллелизма. GOMAXPROCS
В Go есть возможность указать рантайму сколько потоков ОС могут исполнять наш код параллельно. И как следствие этой переменной мы можем ограничить количество ядер которые может использовать наша программа.
🔵 Что еще интересного предлагает Go?
В Go совсем необязательно писать код в том же стиле в котором его пишут на C или C++ с мьютексами. Golang предоставляет возможность процессам общаться друг с другом посредством сообщений в каналах. С точки зрения выразительности кода это совсем не похоже на то что вы могли видеть в большинстве языков.
-----
На этом всё, спасибо что читали! 😊 Если пост зашел буду рад поддержке в любом виде.
Post #349
4.29K