-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathchannel
146 lines (103 loc) · 2.14 KB
/
channel
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
// channel 是引用类型,必须初始化之后才能写入数据,即make之后才能使用
协程:本质是一种用户态线程,不需要操作系统来抢占式调度,且在真正的实现中寄存于线程中,因为系统图开销极小,可以有效提高线程的任务并发性,
channel 是进程内的通信方式。需要跨进程间通信,建议使用分布式系统的方式解决。
//计算出8000以内的素数
package main
import (
"fmt"
"time"
)
// 写入8000个数据
func putNum(intChan chan int) {
for i := 1; i <= 8000; i++ {
intChan <- i
}
close(intChan)
}
func primeNum(intChan chan int, primeChan chan int, exitChan chan bool) {
var flag bool
for {
time.Sleep(time.Millisecond * 10)
num, ok := <-intChan
fmt.Println(num)
fmt.Println(ok)
if !ok {
break
}
flag = true
for i := 2; i < num; i++ {
if num%i == 0 {
flag = false
break
}
}
if flag {
primeChan <- num
}
}
exitChan <- true
}
func main() {
intChan := make(chan int, 1000)
primeChan := make(chan int, 2000)
exitChan := make(chan bool, 4)
go putNum(intChan)
for i := 0; i < 4; i++ {
go primeNum(intChan, primeChan, exitChan)
}
go func() {
for i := 0; i < 4; i++ {
<-exitChan
}
close(primeChan)
}()
for {
res, ok := <-primeChan
if !ok {
break
}
fmt.Printf("素数=%d\n", res)
}
}
// 控制goroutine 并发数量。sync 用法:先统一Add, 在并发Done, 最后Wait"。中心思想是由一个goroutine或主程序来调用Add和Wait方法,其他goroutinue作为子任务调用done方法,否则会引发可能的panic异常
package main
import (
"fmt"
"math"
"sync"
"time"
)
type Glime struct {
n int
c chan struct{}
}
func New(n int) *Glime {
return &Glime{
n: n,
c: make(chan struct{}, n),
}
}
func (g *Glime) Run(f func()) {
g.c <- struct{}{}
go func() {
f()
<-g.c
}()
}
var sg = sync.WaitGroup{}
func main() {
number := 10
g := New(2)
for i := 0; i < number; i++ {
sg.Add(1)
value := 1
foFunc := func() {
fmt.Println(value)
time.Sleep(time.Second)
fmt.Println(math.MaxFloat64)
sg.Done()
}
g.Run(foFunc)
}
sg.Wait()
}