golang中goroutine

时间:2023-03-10 05:56:13
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
}
}
}