本例子并行地访问URL,使用 WaitGroup 进行阻塞,直到所有的取回操作完成。

package main

import (
    "fmt"
    "net/http"
    "sync"
)

var wg sync.WaitGroup

func main() {
    var wg sync.WaitGroup
    var urls = []string{
        "https://www.52bd.net/",
        "https://www.baidu.com/",
        "https://go-zh.org/",
    }
    for _, url := range urls {
        // Increment the WaitGroup counter.
        // 递增 WaitGroup 计数器。
        wg.Add(1)
        // Launch a goroutine to fetch the URL.
        // 启动一个Go程来取回URL。
        go func(url string) {
            defer wg.Done()

            // Decrement the counter when the goroutine completes.
            // Fetch the URL.
            // 请求URL
            resp, _ := http.Get(url)
            fmt.Println(resp.Status)//输出请求状态

        }(url)
    }
    // Wait for all HTTP fetches to complete.
    // 等待所有的HTTP取回操作完成。
    wg.Wait()
}

func (wg *WaitGroup) Add(delta int)

Add 添加 delta,对于 WaitGroup 的 counter 来说,它可能为负数。 若 counter 变为零,在 Wait() 被释放后所有Go程就会阻塞。 若 counter 变为负数,Add 就会引发Panic。

注意,当 counter 为零时,用正整数的 delta 调用它必须发生在调用 Wait 之前。 用负整数的 delta 调用它,或在 counter 大于零时开始用正整数的 delta 调用它, 那么它可以在任何时候发生。 一般来说,这意味着对 Add 的调用应当在该语句创建Go程,或等待其它事件之前执行。 具体见 WaitGroup 的示例。

func (wg *WaitGroup) Done()

Done 递减 WaitGroup 的 counter。

func (wg *WaitGroup) Wait()

Wait 阻塞 WaitGroup 直到其 counter 为零。


版权声明:本文为原创文章,版权归 吾爱博客 所有,转载请联系博主获得授权!
本文地址:https://www.52bd.net/code/202.html

发表评论

正在加载 Emoji
×