可以启动goroutine(即调用'go')失败吗?

问题描述 投票:0回答:1

执行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 concurrency goroutine
1个回答
4
投票

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完成其工作)。

© www.soinside.com 2019 - 2024. All rights reserved.