执行go f
时可能会失败吗?
由于关键字go没有返回值,如何确定在高并发期间是否成功启动了goroutine?
例如:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var wg = &sync.WaitGroup{}
go func() { // How do I know if there is any failure here?
wg.Add(1)
fmt.Println("halo world")
wg.Done()
}()
time.Sleep(time.Nanosecond)
wg.Wait()
}
go
声明不能失败(仅在“极端”情况下,如内存不足,但是失败的go
声明将是你的问题中最少的)。
当然没有同步,你无法保证计划运行goroutine。因此你使用sync.WaitGroup
的例子是不正确的,好像goroutine没有安排直到main
goroutine到达wg.Wait()
,它甚至可能永远不会开始,因为当main
goroutine结束时,你的程序也会结束。
而是在主goroutine中增加WaitGroup的计数器(并且最好调用WaitGroup.Done()
deferred,因此即使goroutine会出现恐慌也会调用它):
var wg = &sync.WaitGroup{}
wg.Add(1)
go func() {
defer wg.Done()
fmt.Println("halo world")
}()
wg.Wait()
那样你甚至不需要睡觉,wg.Wait()
将阻止,直到另一个goroutine调用wg.Done()
(这将发生只有当其他goroutine完成其工作)。