TGViewer
Евгений Козлов пишет про IT Евгений Козлов пишет про IT @careerunderhood · 2.83K subscribers
Post #349 4.29K
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 предоставляет возможность процессам общаться друг с другом посредством сообщений в каналах. С точки зрения выразительности кода это совсем не похоже на то что вы могли видеть в большинстве языков.

-----

На этом всё, спасибо что читали! 😊 Если пост зашел буду рад поддержке в любом виде.
Telegram Евгений Козлов пишет про IT CPU, Memory Models, Concurrency, Multiprocess, Multithreading и Async. Часть 16. Модели организации многопоточности. Сегодня разберемся как обстоят дела в языках программирования с точки зрения моделей многопоточности. Рассмотрим какие модели в принципе…
  • 👍 16
  • 🔥 7
  • ❤ 5
More from @careerunderhood
  1. Oct 2, 2026Пока от темы Concurrency далеко не ушли. В последнем цикле я если и упоминал вопросы произ…
  2. Sep 30, 2026Результаты опроса меня впечатлили. Большинству интересны истории из работы. Поехали, начне…
  3. Sep 25, 2026Post #470
  4. Sep 21, 2026Concurrency, Synchronization and Consistency. Non-blocking. Оглавление Введение - Блокирую…
  5. Sep 21, 2026Concurrency and Consistency. Non-blocking, lock-free and async. Пост №12. Заключение. Когд…
  6. Sep 20, 2026Concurrency and Consistency. Non-blocking, lock-free and async. Пост №11. Самые важные фак…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →