Как указывалось в предыдущих ответах, подпрограммы go не обязательно соответствуют системным потокам, однако я нашел следующее полезное, если вам необходимо повысить производительность многопоточности прямо сейчас:
Текущая реализация среды выполнения Go не будет распараллеливать этот код по умолчанию. Он выделяет только одно ядро для обработки на уровне пользователя. В системных вызовах может быть заблокировано произвольное количество подпрограмм, но по умолчанию только пользователь может выполнять код уровня пользователя в любое время. Он должен быть умнее и однажды он будет умнее , но до тех пор, пока он не станет , если вам нужен параллелизм ЦП, вы должны указать во время выполнения, сколько программ вы хотите выполнить одновременно . Есть два способа сделать это. Либо запустите задание с переменной среды GOMAXPROCS, для которой задано количество ядер для использования, либо импортируйте пакет времени выполнения и вызовите runtime.GOMAXPROCS (NCPU). Полезным значением может быть runtime.NumCPU (), которое сообщает количество логических процессоров на локальном компьютере. Опять же, ожидается, что это требование будет отменено по мере улучшения планирования и времени выполнения.
источник цитаты
Пример программы, которая максимально использует мой процессор i5, таков (использует все 4 ядра на 100% в htop):
package main
import (
"fmt"
"time"
"runtime"
)
func main() {
runtime.GOMAXPROCS(4) // Set the maximum number of threads/processes
d := make(chan string)
go boring("boring!", d, 1)
go boring("boring!", d, 2)
go boring("boring!", d, 3)
go boring("boring!", d, 4)
for i := 0; i < 10; i++ {
time.Sleep(time.Second);
}
fmt.Println("You're boring; I'm leaving.")
}
func boring(msg string, c chan string, id int) {
for i := 0; ; i++ {
}
}
Теперь это на самом деле ничего не делает, но посмотрим, насколько коротко / просто / просто по сравнению с написанием многопоточных приложений на других языках, таких как Java.