goroutine的执行时间点是多少?

时间:2015-06-19 10:32:00

标签: go

我运行以下Go代码10次:

package main

import (
    "fmt"
    "time"
)

func main() {
    go fmt.Println("Hello")
    fmt.Println("World")
    time.Sleep(1 * time.Millisecond)
}

输出始终为“World”:

World
Hello

是否表明goroutine将执行unitl main例程中有一个块? goroutine的执行时间点是什么?

1 个答案:

答案 0 :(得分:4)

  

goroutine的执行时间点是什么?

编译器会在程序中的不同位置插入屈服点。例如,在某些函数调用和看似紧密的循环中。此外,当在系统调用上阻塞时,goroutine将产生。因此,当第一个goroutine达到fmt.Println("World")并进入写入系统调用时,您的程序可能将执行到第二个goroutine。之后会出现非确定性,因为我们不知道这个系统调用需要多长时间。

然而,这是一个实现细节,您不应该关注它。在谈论并行性时,你所拥有的唯一时间保证(即“发生在之前”)是由并发原语提供的那些,如标准库的sync/atomic包中的那些。

TL; DR:不要依靠屈服点让您的程序正常工作。