Go语言中并发

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()
}