File tree Expand file tree Collapse file tree 1 file changed +130
-0
lines changed Expand file tree Collapse file tree 1 file changed +130
-0
lines changed Original file line number Diff line number Diff line change
1
+ # Goroutine
2
+
3
+ 1 . 两个协程轮流打印 ` 1, 2 `
4
+
5
+ ``` go
6
+ package main
7
+
8
+ import (
9
+ " fmt"
10
+ " sync"
11
+ )
12
+
13
+ var wg sync.WaitGroup
14
+
15
+ func main () {
16
+ wg.Add (2 )
17
+ ch1 := make (chan int )
18
+ go func () {
19
+ defer wg.Done ()
20
+ for i := 0 ; i < 10 ; i++ {
21
+ ch1 <- i
22
+ if i%2 == 0 {
23
+ fmt.Println (" 1: " , i)
24
+ }
25
+ }
26
+ }()
27
+ go func () {
28
+ defer wg.Done ()
29
+ for i := 0 ; i < 10 ; i++ {
30
+ <- ch1
31
+ if i%2 == 1 {
32
+ fmt.Println (" 2: " , i)
33
+ }
34
+ }
35
+ }()
36
+ wg.Wait ()
37
+ }
38
+ ```
39
+
40
+ 2 . 三个协程轮流打印 ` 1, 2, 3 `
41
+
42
+ ``` go
43
+ package main
44
+
45
+ import (
46
+ " fmt"
47
+ " sync"
48
+ )
49
+
50
+ func main () {
51
+ var wg sync.WaitGroup
52
+ wg.Add (2 )
53
+ ch1 := make (chan int )
54
+ ch2 := make (chan int )
55
+ go func () {
56
+ defer wg.Done ()
57
+ for i := 0 ; i < 100 ; i++ {
58
+ <- ch1
59
+ <- ch2
60
+ if i%3 == 0 {
61
+ fmt.Println (1 , " : " , i)
62
+ }
63
+ }
64
+ }()
65
+ go func () {
66
+ defer wg.Done ()
67
+ for i := 0 ; i < 100 ; i++ {
68
+ ch1 <- 1
69
+ if i%3 == 1 {
70
+ fmt.Println (2 , " : " , i)
71
+ }
72
+ }
73
+ }()
74
+ go func () {
75
+ defer wg.Done ()
76
+ for i := 0 ; i < 100 ; i++ {
77
+ ch2 <- 1
78
+ if i%3 == 2 {
79
+ fmt.Println (3 , " : " , i)
80
+ }
81
+ }
82
+ }()
83
+ wg.Wait ()
84
+ }
85
+ ```
86
+
87
+ 3 . 生产者消费者模型
88
+
89
+ ``` go
90
+ package main
91
+
92
+ import (
93
+ " fmt"
94
+ " sync"
95
+ )
96
+
97
+ var wg sync.WaitGroup
98
+ var lock sync.Mutex
99
+
100
+ func main () {
101
+ ch := make (chan int , 100 )
102
+ producer (ch)
103
+ cnt := 3
104
+ wg.Add (cnt)
105
+ for i := 0 ; i < cnt; i++ {
106
+ go consumer (i, ch)
107
+ }
108
+ wg.Wait ()
109
+ }
110
+
111
+ func producer (ch chan int ) {
112
+ defer close (ch)
113
+ for i := 0 ; i < 10 ; i++ {
114
+ fmt.Println (" producer: " , i)
115
+ ch <- i
116
+ }
117
+ }
118
+
119
+ func consumer (i int , ch chan int ) {
120
+ for {
121
+ if v , ok := <- ch; ok {
122
+ fmt.Println (" consumer " , i, " :" , v)
123
+ } else {
124
+ break
125
+ }
126
+ }
127
+ wg.Done ()
128
+ }
129
+ ```
130
+
You can’t perform that action at this time.
0 commit comments