我运行以下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
的执行时间点是什么?
答案 0 :(得分:4)
goroutine的执行时间点是什么?
编译器会在程序中的不同位置插入屈服点。例如,在某些函数调用和看似紧密的循环中。此外,当在系统调用上阻塞时,goroutine将产生。因此,当第一个goroutine达到fmt.Println("World")
并进入写入系统调用时,您的程序可能将执行到第二个goroutine。之后会出现非确定性,因为我们不知道这个系统调用需要多长时间。
然而,这是一个实现细节,您不应该关注它。在谈论并行性时,你所拥有的唯一时间保证(即“发生在之前”)是由并发原语提供的那些,如标准库的sync/atomic
包中的那些。
TL; DR:不要依靠屈服点让您的程序正常工作。