【问题标题】:Goroutine concept: direct call vs call using function literalGoroutine 概念:直接调用 vs 使用函数字面量调用
【发布时间】:2019-12-18 12:23:27
【问题描述】:

以下两个代码之间的基本区别是什么?不知何故,在第二个示例中 demo_process2() 从未被调用,但在第一个示例中它工作正常。

    1.
go func() {
    Must(demo_process1())
}()

demo_process2()
    2.
go Must(demo_process1())
demo_process2()

Must():

func Must(err error) {
    if err != nil {
        panic(err)
    }
}

【问题讨论】:

标签: go concurrency goroutine


【解决方案1】:

Spec: Go statements:

调用goroutine中的函数值和参数是evaluated as usual,但与常规调用不同的是,程序执行不会等待调用的函数完成。相反,该函数开始在一个新的 goroutine 中独立执行。

在您的第一个示例中,您启动了一个没有参数的匿名函数(函数字面量)作为新的 goroutine。 Must()demo_process1() 在其中被调用,同时demo_process2()(在“原始”goroutine 中执行)。

然而,在你的第二个例子中:

go Must(demo_process1())
demo_process2()

作为 goroutine 启动的函数是 Must(),其参数在调用 goroutine 中进行评估。 Must() 的参数是demo_process1() 的返回值,表示demo_process1() 在启动新的goroutine 之前首先被调用并等待。只有当它返回时,才能启动新的 goroutine 并调用 demo_process2()(在“原始”goroutine 上)。

总而言之,在第二个示例中,demo_process1()demo_process2() 不是同时运行,而是在同一个 goroutine 中按顺序运行。只有 Must() 在新的 goroutine 上执行(与 demo_process2() 同时执行)。

【讨论】:

    猜你喜欢
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多