从零开始学Go之并发(一):Go程
Go 程(goroutine)是由 Go 运行时管理的轻量级线程。
当一个goroutine创建时,会和其他goroutine一起并发运行, goroutine 由 Go 程序运行时的调度和管理。
Go 程序从 main 包的 main() 函数开始,在程序启动时,Go 程序就会为 main() 函数创建一个默认的 goroutine
所有 goroutine 在 main() 函数结束时会一同结束。
Go 程在相同的地址空间中运行,因此在访问共享的内存时必须进行同步。
创建:
go 函数名( 参数列表 )
go say("world")
使用 go 关键字创建 goroutine 时,被调用函数的返回值会被忽略。
如果需要在 goroutine 中返回数据,请使用后面介绍的通道(channel)特性,通过通道把数据从 goroutine 中作为返回值传出。
匿名函数创建:
go func(参数列表){
函数体
}(调用参数列表)
go func(s string) { for i := 0; i < 5; i++ { time.Sleep(100 * time.Millisecond) fmt.Println(s) } }("hello")
调整并发的运行性能:
Go 地中也可以通过 runtime.GOMAXPROCS() 函数做到
runtime.GOMAXPROCS(逻辑CPU数量)
这里的逻辑CPU数量可以有如下几种数值:
<1:不修改任何数值
=1:单核心执行
>1:多核并发执行
一般情况下,可以使用 runtime.NumCPU() 查询 CPU 数量,并使用 runtime.GOMAXPROCS() 函数进行设置,例如:
runtime.GOMAXPROCS(runtime.NumCPU())
从 Go 1.5 版本开始,默认执行上面语句以便让代码并发执行,最大效率地利用 CPU。