定义
在go里面,每一个并发执行的活动成为goroutine。
详解:goroutine可以认为是轻量级的线程,与创建线程相比,创建成本和开销都很小,每个goroutine的堆栈只有几kb,并且堆栈可根据程序的需要增长和缩小(线程的堆栈需指明和固定),所以go程序从语言层面支持了高并发。
程序执行的背后:当一个程序启动的时候,只有一个goroutine来调用main函数,称它为主goroutine,新的goroutine通过go语句进行创建。
单个goroutine创建
在函数或者方法前面加上关键字go,即创建一个并发运行的新goroutine。
示例如下:
package main
import ("fmt""time"
)
func HelloWorld() {
fmt.Println("Hello world goroutine")
}
func main() {
go HelloWorld() // 开启一个新的并发运行
time.Sleep(1*time.Second)
fmt.Println("我后面才输出来")
}
执行结果:
Hello world goroutine 我后面才输出来
多个goroutine创建
示例:
package main
import ("fmt""time"
)
func main() {
go DelayPrint()
go helloworld()
time.Sleep(10*time.Second)
fmt.Println("aaa")
}
func helloworld(){
fmt.Println("hello goroutine")
}
func DelayPrint(){for i := 1; i <= 4; i++ {
time.Sleep(5*time.Second)
fmt.Println(i)}
}
输出结果:
hello goroutine 1 aaa
结论:
1.当main函数返回时,所有的gourutine都是暴力终结的,然后程序退出
2.当程序执行go FUNC()的时候,只是简单的调用然后就立即返回了,并不关心函数里头发生的故事情节,所以不同的goroutine直接不影响,main会继续按顺序执行语句