使用通道的 MapReduce 任务

我的函数下载数据,解析它并返回一些结果。我想同时启动该函数的多个实例并总结它们的结果。这是我的解决方案,使用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()

据我所知,channelsGo 中推荐使用同步机制。您能告诉我如何使用通道重写此任务吗?


繁星点点滴滴
浏览 75回答 1
1回答

红糖糍粑

有多种使用渠道的解决方案。一个可能看起来像这样:ch := make(chan *engine2.DownloadResult)wg := sync.WaitGroup()go func() {&nbsp; &nbsp;for result := range ch {&nbsp; &nbsp; &nbsp; increment_without_lock(result)&nbsp; &nbsp;}}()for _, playlist := range repository.PlaylistRepository.Fetch() {&nbsp; &nbsp; id := playlist.Id&nbsp; &nbsp; wg.Add(1)&nbsp; &nbsp; go func() {&nbsp; &nbsp; &nbsp; &nbsp;defer wg.Done()&nbsp; &nbsp; &nbsp; &nbsp;ch <- engine.DownloadPlaylist(id)&nbsp; &nbsp; }()}wg.Wait()close(ch)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go