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