我的函数下载数据,解析它并返回一些结果。我想同时启动该函数的多个实例并总结它们的结果。这是我的解决方案,使用Mutex:var lock sync.Mutexincrement := func(data engine2.DownloadResult) { lock.Lock() defer lock.Unlock() albums += data.Album singles += data.Single}var wg sync.WaitGroupfoo := 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()据我所知,channelsGo 中推荐使用同步机制。您能告诉我如何使用通道重写此任务吗?
1 回答
红糖糍粑
TA贡献1815条经验 获得超6个赞
有多种使用渠道的解决方案。一个可能看起来像这样:
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)
- 1 回答
- 0 关注
- 78 浏览
添加回答
举报
0/150
提交
取消