我的函数下载数据,解析它并返回一些结果。我想同时启动该函数的许多实例,并对它们的结果进行总结。这是我使用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中推荐的同步机制。您能告诉我如何使用 channel 重写此任务吗? 最佳答案
使用 channel 有多种解决方案。一个可能看起来像这样:
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)
关于go - 使用 channel 的MapReduce任务,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58143271/