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