返回与Goexit for goroutines

时间:2015-07-27 15:28:03

标签: go

我做了一些挖掘,但没有找到任何令人满意的东西,所以我问:他们是否有任何最佳实践或使用return和runtime.Goexit退出goroutine的优点/缺点?到目前为止,我在一些测试中遇到的唯一问题是,如果你使用的是waitgroups,它可能不会调用Done函数。

特定于waitgroups(如果感兴趣):在我的代码库中的一些快速测试中,我创建了一个匿名函数,作为goroutine执行,以测试应该在goroutine中运行的方法。我试图使用defer让它调用wg.Done()当函数调用runtime.Goexit时,但它没有用。不确定这是故意还是错误。

代码示例:

go func() {
    wg.Add(1)
    defer wg.Done()
    // Function goes here...
}()

1 个答案:

答案 0 :(得分:7)

您应该很少需要使用runtime.Goexit。当无法从呼叫站点返回时,它用于终止当前goroutine,例如当你在goroutine中进行函数调用时。在std库中,测试包在FailNowSkipNow等函数中使用它来立即结束当前测试。通常,您应该从goroutine正常返回以保持代码清晰,并防止意外行为。

您的示例中的问题是,您需要在启动goroutine之前致电wg.Add ,否则您可以在Wait之前拨打wg.Add来电电话已被执行。

wg.Add(1)
go func() {
    defer wg.Done()
    // Function goes here...
}()