golang中goroutine
1. 概念
goroutine 奉行通过通信来共享内存,而不是共享内存来通信
goroutine 是由go的运行时(runtime)调度和管理的
go程序会智能的将goroutine中的任务合理的分配给CPU执行
go语言之所以会被称为现代化编程语言,是因为它在语言层面已经内置了调度和上下文切换的机制
在go语言编程中你不需要自己去写进程、线程、协程,当你需要让某个任务并发执行的时候,
你只需要把这个任务包装成一个函数,开启一个goroutine去执行这个函数就可以了。
一个goroutine必须对应一个函数,可以创建多个goroutine去执行相同的函数
2. goroutine实现同步
package main import ( "fmt" "sync" ) var wg sync.WaitGroup func main() { for i := 0; i < 10; i++ { wg.Add(1) go hello(i) } // 此处使用sync.WaitGroup来实现goroutine的同步 wg.Wait() // 多次执行代码,发现打印的顺序不一致,因为10个goroutine是并发执行的,而goroutine的调度是随机的 } func hello(i int) { defer wg.Done() fmt.Println("goroutine", i) }
3. 子goroutine是依赖于主goroutine的,主goroutine一旦结束,子goroutine立马结束
package main import ( "fmt" "time" ) func main() { // 合起来写 go func() { i := 0 for { i++ fmt.Printf("new goroutine: i = %d\n", i) time.Sleep(time.Second) } }() i := 0 for { i++ fmt.Printf("main goroutine: i = %d\n", i) time.Sleep(time.Second) if i == 2 { break } } }