Распараллеливание вычислений в Go | OTUS

Курсы

Программирование
PHP Developer. Basic
-50%
Специализация PHP Developer iOS Developer. Professional Golang Developer. Professional Python Developer. Basic iOS Developer. Basic Архитектура и шаблоны проектирования MS SQL Server Developer Highload Architect Специализация C++ Developer Cloud Solution Architecture Специализация Java-разработчик Android Developer. Professional Программист С Специализация Fullstack developer VR/AR - разработчик Microservice Architecture Software Architect Team Lead Web-разработчик на Python Rust Developer NoSQL C# Developer. Professional Разработчик программных роботов (RPA) на базе UiPath и PIX Kotlin Backend Developer React.js Developer Node.js Developer Flutter Mobile Developer Symfony Framework C# Developer. Basic Unreal Engine Game Developer Groovy Developer
Специализации Курсы в разработке Подготовительные курсы Подписка
+7 499 938-92-02

Распараллеливание вычислений в Go

GoPro_Headline_970x70-1801-dc9277.png

Когда есть возможность разбить вычисление на отдельные части, которые можно выполнить независимо, тогда вычисление в Go можно распараллелить. При этом потребуется использовать каналы для сигнализирования о том, что та или иная часть вычисления завершается. Представим, что у нас есть операция для вектора элементов, а значение операции для каждого элемента независимо по своей сути. Приведем пример (правда, немного идеализированный, но все же):

1-1801-720296.png

В примере выше мы осуществляем запуск отдельных частей вычислений независимо друг от друга, причем по одному вычислению на каждое ядро процессора. Такие вычисления можно выполнить в любом порядке, однако это не важно, ведь мы считаем сигналы завершения, лишь опустошив канал, то есть после запуска всех Go-процедур.

2-1801-ba9fd9.png

При этом вместо создания постоянных значений для numCPU, у нас есть возможность спросить среду выполнения, какое конкретно значение уместно. Здесь функция runtime.NumCPU будет возвращать число аппаратных ядер процессора на машине, следовательно, можно написать:

3-1801-878956.png

Кроме того, существует функция runtime.GOMAXPROCS, сообщающая (либо устанавливающая) указанное пользователем число ядер, которое способна запустить Golang-программа одновременно. По дефолту применяется значение runtime.NumCPU, однако его можно переопределить установкой одноименной переменной среды оболочки либо вызовом данной функции с положительным номером. Также следует отметить, что вызов этой функции с нулем просто запросит значение. Следовательно, если надо удовлетворить запрос ресурса пользователя, следует написать:

4-1801-9b76fc.png

Главное, в чем следует убедиться, осваивая данную тему, -- что вы не путаете 2 основные идеи параллелизма:

  • параллелизма, как структурирования программы в качестве независимо выполняемых компонентов;
  • параллелизма как выполнения параллельных вычислений в целях повышения эффективности работы на нескольких ядрах процессора.

И, хоть функции параллелизма в Go и способны облегчить ряд проблем структурирования и параллельных вычислений, следует понимать, что Go -- это все же многопоточный язык, а не параллельный, поэтому далеко не все проблемы распараллеливания отвечают модели Go.

По материалам https://golang-blog.blogspot.com/.

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться