• Задача
  • Решение
  • Обсуждение

FanOutSum: воркеры на один канал

Пачка задач раздаётся нескольким воркерам через общий канал. Реализуйте fanOutSum: воркеры читают канал через range, суммируют, производитель закрывает канал, WaitGroup ждёт.

GolangРешение
func fanOutSum(tasks []int, workers int) int {
	ch := make(chan int)
	var wg sync.WaitGroup
	var sum int64
	for i := 0; i < workers; i++ {
		wg.Add(1)
		go func() {
			defer wg.Done()
			for t := range ch {
				atomic.AddInt64(&sum, int64(t))
			}
		}()
	}
	for _, t := range tasks {
		ch <- t
	}
	close(ch)
	wg.Wait()
	return int(atomic.LoadInt64(&sum))
}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

00:00:00
Наш сайт собирает куки. Чтобы тебе было удобнее им пользоваться. Нажимая на кнопку, ты даёшь разрешение собирать куки