go - 使用 channel 的 MapReduce 任务

标签 go

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

据我所知, channel 是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/

相关文章:

go - 找go版本

go - 时间刻度数据库不创建超表

go - 如何提取go内置函数代码,如delete()

go - 为什么godoc不跳过golang中的例子?

windows - Go- CPU/内存/网络

json - golang无法解析反射创建的对象的json

go - golang 基准测试可以提供自定义输出吗?

go - 如何检查是否已写入标准输出?

go - 动态创建结构

外部类型问题的 JSON 序列化 - 将 map[string]interface{} 项转换为 int