1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| package main
import ( "fmt" "runtime" "sync" )
//goroutine 类似于线程 属于用户态的线程 //goroutine 由go语言运行时(runtime)调度完成 而线程由操作系统调度完成
//需要并发执行任务时 只需将这个任务包装成一个函数 开启goroutine去执行它 //一个goroutine 必定对应一个函数 可以创建多个goroutine去执行相同函数
//操作系统线程 一般有固定的栈内存(通常2MB) 一个goroutine的栈启动时的栈内存(通常2KB) 可以按需增加或缩小
//func TestFn(i int) { // //函数出错也能释放 // defer wg.Done() // fmt.Println("Hello World!", i) // //任务完成后计数器减1 // //}
//定义全局变量wg 实现goroutine同步 var wg sync.WaitGroup
//GOMAXPROCS 配置多个os线程同时执行 func a() { defer wg.Done() for i := 1; i < 10; i++ { fmt.Println("A:", i) } }
func b() { defer wg.Done() //for i := 1; i < 10; i++ { // fmt.Println("B:", i) //} i := 0 for { i ++ } }
//系统线程与goroutine关系 //一个操作系统线程对应用户态多个goroutine //go可以同时使用多个操作系统线程 //goroutine和os线程是多对多关系 即m:n
func main() { //for i := 0; i < 10; i ++ { // //启动一个任务 计数器加1 // wg.Add(1) // go TestFn(i) //} //wg.Wait() //fmt.Println("This is MainFunc") //配置go程序运行时使用多个个逻辑CPU核心 m:n n启动 线程数,通常n设置为cpu逻辑核心 runtime.GOMAXPROCS(1) wg.Add(5) go a() go b() go b() go b() go b() wg.Wait() }
|