-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmanyToOne.go
173 lines (151 loc) · 3.34 KB
/
manyToOne.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
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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
package main
import (
"encoding/json"
"flag"
"fmt"
"math/rand"
"sync"
"time"
)
type divider struct {
N int
A []int
}
var (
n1 = flag.Int("N1", 10, "Этап №-1 кол-во горутин")
m1 = flag.Int("M1", 7, "Этап №-2 кол-во горутин")
k1 = flag.Int("K1", 15, "Этап №-3 кол-во горутин")
n2 = flag.Int("N2", 200, "Интервал N2 в млсек")
a = flag.Int("a", 4, "Начальное значение интервала случайного числа")
b = flag.Int("b", 9, "Конечное значение интервала случайного числа")
allTime = flag.Int("B", 2, "Время работы программы в сек")
num_ch = make(chan int)
stop = make(chan struct{})
echo = make(chan struct{})
div_ch = make(chan []byte)
json_array = [][]byte{}
)
func allDiv(n int) []int {
var a = []int{1}
for i := 2; i < n; i++ {
if n%i == 0 {
a = append(a, i)
}
}
a = append(a, n)
return a
}
func findNum(b [2]int, wg *sync.WaitGroup) {
defer wg.Done()
v := rand.Intn(b[1]-b[0]+1) + b[0]
if v == b[1] {
fmt.Println("max element find")
echo <- struct{}{} // отправляем в канал метку, что максимальный элемент был найден
}
num_ch <- v
}
func workTime(wg *sync.WaitGroup) {
defer wg.Done()
t := time.NewTimer(time.Second * time.Duration(*allTime))
select {
case <-t.C:
fmt.Println("Timer is stopped")
echo <- struct{}{}
case <-stop:
fmt.Println("Close the Timer")
t.Stop()
}
}
func doTick(wg *sync.WaitGroup) {
defer wg.Done()
t := time.NewTicker(time.Millisecond * time.Duration(*n2))
go func() {
defer close(div_ch)
wg := new(sync.WaitGroup)
for i := 0; i < *m1; i++ {
wg.Add(1)
go Find_dividers(wg)
}
wg.Wait()
}()
wg1 := new(sync.WaitGroup)
do := true
for do {
select {
case <-t.C:
fmt.Println("do tick")
for i := 0; i < *n1; i++ {
wg1.Add(1)
go findNum([2]int{*a, *b}, wg1)
}
case <-stop:
fmt.Println("stop Ticker")
t.Stop()
do = false
}
}
wg1.Wait()
close(num_ch)
}
func listenEcho() {
b := true
for range echo {
if b {
fmt.Println("Stopping all goroutines!!!")
close(stop)
b = false
}
}
}
func Find_dividers(wg *sync.WaitGroup) {
defer wg.Done()
for v := range num_ch { //???
val := new(divider)
val.N = v
val.A = allDiv(v)
data, err := json.MarshalIndent(val, "", "\t")
if err != nil {
fmt.Println(err)
//return ??? в канал ничего не пишем
} else {
div_ch <- data
}
}
}
func findMax() int {
data := []divider{}
max := 0
for _, v := range json_array {
var d divider
if err := json.Unmarshal(v, &d); err != nil {
//return???
}
data = append(data, d)
if max < d.N {
max = d.N
}
}
return max
}
func main() {
flag.Parse()
wg := new(sync.WaitGroup)
wg.Add(2)
go workTime(wg)
go doTick(wg)
go listenEcho()
go func() {
for v := range div_ch { // получаем из канала общие делители числа num
json_array = append(json_array, v) // записываем даные: все делители числа num в массив
}
}()
ch := make(chan struct{})
go func() {
defer close(echo)
defer close(ch)
//defer close(num_ch)
wg.Wait()
}()
<-ch
fmt.Println("Finish max number is ", findMax())
}