Ch04_Thread
Yang Haoran 12/22/2022 Go
# 协程
关键字:go

func main() {
go test()
for i := 0; i < 10; i++ {
fmt.Println("from main", i)
time.Sleep(time.Millisecond)
}
}
func test() {
for i := 0; i < 10; i++ {
fmt.Println("from go: ", i)
time.Sleep(time.Millisecond)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
result:
from go: 0
from main 0
from main 1
from go: 1
from go: 2
from main 2
from main 3
from go: 3
from go: 4
from main 4
from main 5
from go: 5
from main 6
from go: 6
from go: 7
from main 7
from main 8
from go: 8
from go: 9
from main 9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# MPG 模式

- 自动挂载到非阻塞的线程执行

# Channel

协程之间公用同一个变量的时侯会出现问题
func multi(i int) { var result int for j := 1; j < i+1; j++ { result *= i } m[i] = result } var m = make(map[int]int) func main() { for i := 0; i < 200; i++ { go multi(i) } time.Sleep(time.Second * 10) for k, v := range m { fmt.Println("output: ", k, "-->", v) } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20- 解决办法1: 加互斥锁

- 解决办法2: channel(线程安全)




读写数据:


func main() { //容量为3 var strCha = make(chan string, 3) strCha <- "aaa" strCha <- "bbb" //strCha <- "ccc" fmt.Println(len(strCha)) //2 fmt.Println(cap(strCha)) //3 str := <-strCha fmt.Println(str) // aaa fmt.Println(len(strCha)) //1 fmt.Println(cap(strCha)) //3 //关闭channel,不能往里面写数据了,但是还是可以往里面读数据 close(strCha) }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16存任意数据,在取出的时候要用类型断言http://c.biancheng.net/view/4281.html


# Example:重要
当编译器看到一个管道只有写但没有读的话会报错





后面 }()\