首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何限制goroutine

如何限制goroutine
EN

Stack Overflow用户
提问于 2017-08-07 17:54:40
回答 1查看 899关注 0票数 1

我正在开发一个基于google api的gmail客户端。

我有一个通过这个调用获得的标签列表

代码语言:javascript
复制
r, err := s.gClient.Service.Users.Labels.List(s.gClient.User).Do()

然后,对于每个标签,我需要获取详细信息

代码语言:javascript
复制
for _, l := range r.Labels {
    d, err := s.gClient.Service.Users.Labels.Get(s.gClient.User, l.Id).Do()
}

我想以一种更强大的方式处理循环,所以我在循环中实现了goroutine:

代码语言:javascript
复制
ch := make(chan label.Label)

for _, l := range r.Labels {

    go func(gmailLabels *gmailclient.Label, gClient *gmail.Client, ch chan<- label.Label) {

        d, err := s.gClient.Service.Users.Labels.Get(s.gClient.User, l.Id).Do()

        if err != nil {
            panic(err)
        }

        // Performs some operation with the label `d`
        preparedLabel := ....

        ch <- preparedLabel

    }(l, s.gClient, ch)
}

for i := 0; i < len(r.Labels); i++ {
    lab := <-ch
    fmt.Printf("Processed %v\n", lab.LabelID)
}

这段代码的问题是gmail api有一个速率限制,所以,我得到了这个错误:

代码语言:javascript
复制
panic: googleapi: Error 429: Too many concurrent requests for user, rateLimitExceeded

处理这种情况的正确方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-07 18:08:11

例如,如果只启动10个goroutines,并将值从一个for循环传递到另一个go例程中。信道具有较小的缓冲器以减少同步时间。

代码语言:javascript
复制
chIn := make(chan label.Label, 20)
chOut := make(chan label.Label, 20)

for i:=0;i<10;i++ {
    go func(gClient *gmail.Client, chIn chan label.Label, chOut chan<- label.Label) {

        for gmailLabels := range chIn {
            d, err := s.gClient.Service.Users.Labels.Get(s.gClient.User, l.Id).Do()

            if err != nil {
                panic(err)
            }

            // Performs some operation with the label `d`
            preparedLabel := ....

            chOut <- preparedLabel

        }

    }(s.gClient, chIn, chOut)

}

go func(chIn chan label.Label) {
    defer close(chIn)
    for _, l := range r.Labels {
        chIn <- l
    }
}(chIn)

for i := 0; i < len(r.Labels); i++ {
    lab := <-chOut
    fmt.Printf("Processed %v\n", lab.LabelID)
}

编辑:

这里有一个playground sample

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45544133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档