登录
首页 >  Golang >  Go问答

利用信道的 MapReduce 工作

来源:stackoverflow

时间:2024-02-23 12:12:17 150浏览 收藏

欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《利用信道的 MapReduce 工作》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!

问题内容

我的函数下载数据,解析它并返回一些结果。我想同时启动该函数的多个实例并总结它们的结果。这是我使用 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 中推荐的同步机制。您能告诉我如何使用通道重写此任务吗?


解决方案


有多种使用通道的解决方案。可能看起来像这样:

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)

本篇关于《利用信道的 MapReduce 工作》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>