Я написал довольно много production кода на Go. Goroutins я использую только для асинхронного обслуживания портов, соккетов, файлов. Мне ни разу не удалось эффективно распараллелить расчетный алгоритм, ни разу. Даже классическое решето Эратосфена за авторством команды разработчиков языка
package main
func Generate(ch chan<- int) {
for i := 2; ; i++ {
ch <- i
}
}
func Filter(in <-chan int, out chan<- int, prime int) {
for {
i := <-in
if i%prime != 0 {
out <- i
}
}
}
func main() {
ch := make(chan int)
go Generate(ch)
for i := 0; i < 10; i++ {
prime := <-ch
print(prime, "\n")
ch1 := make(chan int)
go Filter(ch, ch1, prime)
ch = ch1
}
}
на моей лучшей машине(два камня 20 ядер) не дает сколько нибудь существенного прироста к последовательной версии.
Что я упускаю, покажите пожалуйста эффективный параллельный код.