Задача MapReduce с использованием каналов - PullRequest
1 голос
/ 28 сентября 2019

Моя функция загружает данные, анализирует их и возвращает некоторый результат.Я хотел бы одновременно запустить много экземпляров функции и подвести их итоги.Вот мое решение с использованием Mutex:

var lock sync.Mutex
increment := func(data engine2.DownloadResult) {
    lock.Lock()
    defer lock.Unlock()
    albums += data.Album
    singles += data.Single
}

var wg sync.WaitGroup
foo := func(id uint) {
    defer wg.Done()
    result := engine.DownloadPlaylist(id)
    increment(*result)
}

for _, playlist := range repository.PlaylistRepository.Fetch() {
    wg.Add(1)
    go foo(playlist.Id)
}

wg.Wait()

Как я знаю channels рекомендуются механизмы синхронизации в Go.Не могли бы вы показать мне, как я могу переписать эту задачу с использованием каналов?

1 Ответ

2 голосов
/ 28 сентября 2019

Существует несколько решений, использующих каналы.Это может выглядеть так:

ch := make(chan *engine2.DownloadResult)
wg := sync.WaitGroup()
go func() {
   for result := range ch {
      increment_without_lock(result)
   }
}()
for _, playlist := range repository.PlaylistRepository.Fetch() {
    id := playlist.Id
    wg.Add(1)
    go func() {
       defer wg.Done()
       ch <- engine.DownloadPlaylist(id)
    }()
}
wg.Wait()
close(ch)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...