HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: go, golang, распараллеливание, вычисления</p>
1 <p>Теги: go, golang, распараллеливание, вычисления</p>
2 <p>Когда есть возможность разбить вычисление на отдельные части, которые можно выполнить независимо, тогда<strong>вычисление в Go можно распараллелить</strong>. При этом потребуется использовать каналы для сигнализирования о том, что та или иная часть вычисления завершается.</p>
2 <p>Когда есть возможность разбить вычисление на отдельные части, которые можно выполнить независимо, тогда<strong>вычисление в Go можно распараллелить</strong>. При этом потребуется использовать каналы для сигнализирования о том, что та или иная часть вычисления завершается.</p>
3 <p>Представим, что у нас есть операция для вектора элементов, а значение операции для каждого элемента независимо по своей сути. Приведем пример (правда, немного идеализированный, но все же):</p>
3 <p>Представим, что у нас есть операция для вектора элементов, а значение операции для каждого элемента независимо по своей сути. Приведем пример (правда, немного идеализированный, но все же):</p>
4 <p>В примере выше мы осуществляем запуск отдельных частей вычислений независимо друг от друга, причем по одному вычислению на каждое ядро процессора. Такие вычисления можно выполнить в любом порядке, однако это не важно, ведь мы считаем сигналы завершения, лишь опустошив канал, то есть после запуска всех Go-процедур.</p>
4 <p>В примере выше мы осуществляем запуск отдельных частей вычислений независимо друг от друга, причем по одному вычислению на каждое ядро процессора. Такие вычисления можно выполнить в любом порядке, однако это не важно, ведь мы считаем сигналы завершения, лишь опустошив канал, то есть после запуска всех Go-процедур.</p>
5 <p>При этом вместо создания постоянных значений для numCPU, у нас есть возможность спросить среду выполнения, какое конкретно значение уместно. Здесь функция runtime.NumCPU будет возвращать число аппаратных ядер процессора на машине, следовательно, можно написать:</p>
5 <p>При этом вместо создания постоянных значений для numCPU, у нас есть возможность спросить среду выполнения, какое конкретно значение уместно. Здесь функция runtime.NumCPU будет возвращать число аппаратных ядер процессора на машине, следовательно, можно написать:</p>
6 <p>Кроме того, существует функция runtime.GOMAXPROCS, сообщающая (либо устанавливающая) указанное пользователем число ядер, которое способна запустить Golang-программа одновременно. По дефолту применяется значение runtime.NumCPU, однако его можно переопределить установкой одноименной переменной среды оболочки либо вызовом данной функции с положительным номером. Также следует отметить, что вызов этой функции с нулем просто запросит значение. Следовательно, если надо удовлетворить запрос ресурса пользователя, следует написать:</p>
6 <p>Кроме того, существует функция runtime.GOMAXPROCS, сообщающая (либо устанавливающая) указанное пользователем число ядер, которое способна запустить Golang-программа одновременно. По дефолту применяется значение runtime.NumCPU, однако его можно переопределить установкой одноименной переменной среды оболочки либо вызовом данной функции с положительным номером. Также следует отметить, что вызов этой функции с нулем просто запросит значение. Следовательно, если надо удовлетворить запрос ресурса пользователя, следует написать:</p>
7 <p>Главное, в чем следует убедиться, осваивая данную тему, -- что вы не путаете 2 основные идеи параллелизма:</p>
7 <p>Главное, в чем следует убедиться, осваивая данную тему, -- что вы не путаете 2 основные идеи параллелизма:</p>
8 <ul><li>параллелизма, как структурирования программы в качестве независимо выполняемых компонентов;</li>
8 <ul><li>параллелизма, как структурирования программы в качестве независимо выполняемых компонентов;</li>
9 <li>параллелизма как выполнения параллельных вычислений в целях повышения эффективности работы на нескольких ядрах процессора.</li>
9 <li>параллелизма как выполнения параллельных вычислений в целях повышения эффективности работы на нескольких ядрах процессора.</li>
10 </ul><p>И, хоть функции параллелизма в Go и способны облегчить ряд проблем структурирования и параллельных вычислений, следует понимать, что Go -- это все же многопоточный язык, а не параллельный, поэтому далеко не все проблемы распараллеливания отвечают модели Go.</p>
10 </ul><p>И, хоть функции параллелизма в Go и способны облегчить ряд проблем структурирования и параллельных вычислений, следует понимать, что Go -- это все же многопоточный язык, а не параллельный, поэтому далеко не все проблемы распараллеливания отвечают модели Go.</p>
11 <p><em>По материалам https://golang-blog.blogspot.com/.</em></p>
11 <p><em>По материалам https://golang-blog.blogspot.com/.</em></p>
12  
12