Go语言高级编程:等待Goroutine完成执行

时间:2019-10-29 作者:golang

Go语言高级编程:等待Goroutine完成执行

GO语言高级编程题目:
如何等待Goroutine完成执行?

GO语言自学网解答:
同步包的WaitGroup类型,用于等待程序完成从主函数启动的所有goroutine。它使用一个指定goroutine数量的计数器,并且Wait阻止程序执行,直到WaitGroup计数器为零。

该添加方法用于添加计数器到WaitGroup。

使用defer语句调度WaitGroup 的Done方法以减少WaitGroup计数器。

WaitGroup类型的Wait方法等待程序完成所有goroutine。

在主函数内部调用Wait方法,该方法将阻止执行,直到WaitGroup计数器的值为零为止,并确保所有goroutine都已执行。

Go语言代码实现:

package main

import (
"fmt"
"io/ioutil"
"log"
"net/http"
"sync"
)

// WaitGroup is used to wait for the program to finish goroutines.
var wg sync.WaitGroup

func responseSize(url string) {
// Schedule the call to WaitGroup's Done to tell goroutine is completed.
defer wg.Done()

fmt.Println("Step1: ", url)
response, err := http.Get(url)
if err != nil {
log.Fatal(err)
}

fmt.Println("Step2: ", url)
defer response.Body.Close()

fmt.Println("Step3: ", url)
body, err := ioutil.ReadAll(response.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println("Step4: ", len(body))
}

func main() {
// Add a count of three, one for each goroutine.
wg.Add(3)
fmt.Println("Start Goroutines")

go responseSize("https://www.golangprograms.com")
go responseSize("https://stackoverflow.com")
go responseSize("https://coderwall.com")

// Wait for the goroutines to finish.
wg.Wait()
fmt.Println("Terminating Program")
}

 

当您运行上述程序时,您可能会看到以下输出:

C:\Golang\goroutines\create-simple-goroutine>go run main.go
Start Goroutines
Step1: https://coderwall.com
Step1: https://www.golangprograms.com
Step1: https://stackoverflow.com
Step2: https://stackoverflow.com
Step3: https://stackoverflow.com
Step4: 116749
Step2: https://www.golangprograms.com
Step3: https://www.golangprograms.com
Step4: 79801
Step2: https://coderwall.com
Step3: https://coderwall.com
Step4: 203842
Terminating Program

 

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:2100506673@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。