为了账号安全,请及时绑定邮箱和手机立即绑定

使用通道的 MapReduce 任务

使用通道的 MapReduce 任务

Go
繁星点点滴滴 2023-07-26 17:16:36
我的函数下载数据,解析它并返回一些结果。我想同时启动该函数的多个实例并总结它们的结果。这是我的解决方案,使用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)


查看完整回答
反对 回复 2023-07-26
  • 1 回答
  • 0 关注
  • 78 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信