uvelichitel
@uvelichitel
habrahabr.ru/users/uvelichitel

Приведите пример эффективного параллельного кода на Go?

Я написал довольно много 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 ядер) не дает сколько нибудь существенного прироста к последовательной версии.
Что я упускаю, покажите пожалуйста эффективный параллельный код.
  • Вопрос задан
  • 762 просмотра
Решения вопроса 1
@rustler2000
погромист сикраш
https://medium.com/@_orcaman/when-too-much-concurr...
https://github.com/klauspost/pgzip/blob/master/REA... см. Benchmark
https://github.com/anthonynsimon/bild - ну тут нет бенмарков для GOMAXPROCS=1 vs real

+ блочное шифрование большого объёма данных
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@m0nym
А параллельный код не всегда дает преимущество. Иногда накладные расходы на блокировки - существенно выше.
Поэтому, в частности, многие серьезные приложения - однопоточные.

А ваш тест слишком мал, куча накладных расходов, не относящихся к распараллеливанию.
Ответ написан
Комментировать
danial72
@danial72
flutter dart.
Мне кажется эффективность в параллельных вычислениях го дает, только при операциях ввода вывода, а в остальных случаях он просто достаточно быстр.
Тот же веб сервер или программа, которая в кучу потоков пишет в файлы.
Но в расчетах пользы мало
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы