Go goroutines 不是 运行
Go goroutines are not running
今天,我了解了buffered channels
。我面临的问题是,我正在使用 WaitGroup 的 Wait
函数来执行所有 goroutines。
但是并不是所有的goroutine都在执行,程序没有等到所有的goroutine都执行完就先结束了
代码:
func main() {
// initializing a WaitGroup
var wg sync.WaitGroup
// adding 3 counts/buffer to the WaitGroup
wg.Add(3)
fmt.Println("Start Goroutines")
go responseSize("https://www.golangprograms.com", &wg)
go responseSize("https://whosebug.com", &wg)
go responseSize("https://coderwall.com", &wg)
// wait for goroutines to finish
wg.Wait()
fmt.Println("Terminating the main program")
}
// just prints the response size of the body returned
func responseSize(url string, wg *sync.WaitGroup) {
// schedule the Done() call when the goroutine is finished
wg.Done()
fmt.Println("Step1: ", url)
response, err := http.Get(url)
if err != nil {
log.Fatal(err)
}
fmt.Println("Step2: ", url)
body, err := ioutil.ReadAll(response.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println("Step3: ", len(body))
}
我是不是漏掉了什么?
而不是
wg.Done()
使用
defer wg.Done()
按照它的编写方式,你的 goroutines 在开始时发出工作已经完成的信号 运行,而不是在它们结束时发出信号,允许主 goroutine 继续并退出。
今天,我了解了buffered channels
。我面临的问题是,我正在使用 WaitGroup 的 Wait
函数来执行所有 goroutines。
但是并不是所有的goroutine都在执行,程序没有等到所有的goroutine都执行完就先结束了
代码:
func main() {
// initializing a WaitGroup
var wg sync.WaitGroup
// adding 3 counts/buffer to the WaitGroup
wg.Add(3)
fmt.Println("Start Goroutines")
go responseSize("https://www.golangprograms.com", &wg)
go responseSize("https://whosebug.com", &wg)
go responseSize("https://coderwall.com", &wg)
// wait for goroutines to finish
wg.Wait()
fmt.Println("Terminating the main program")
}
// just prints the response size of the body returned
func responseSize(url string, wg *sync.WaitGroup) {
// schedule the Done() call when the goroutine is finished
wg.Done()
fmt.Println("Step1: ", url)
response, err := http.Get(url)
if err != nil {
log.Fatal(err)
}
fmt.Println("Step2: ", url)
body, err := ioutil.ReadAll(response.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println("Step3: ", len(body))
}
我是不是漏掉了什么?
而不是
wg.Done()
使用
defer wg.Done()
按照它的编写方式,你的 goroutines 在开始时发出工作已经完成的信号 运行,而不是在它们结束时发出信号,允许主 goroutine 继续并退出。