Skip to content

Commit 6529c14

Browse files
committed
worker
1 parent 9d69a60 commit 6529c14

File tree

2 files changed

+70
-0
lines changed

2 files changed

+70
-0
lines changed

closure/main.go

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
)
6+
7+
func main() {
8+
s := []string{"a", "b", "c"}
9+
for _, v := range s {
10+
go func(v string) {
11+
fmt.Println(v)
12+
}(v)
13+
}
14+
select {}
15+
}

go-routines/workers_final/main.go

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package main
2+
3+
import "fmt"
4+
5+
var N int = 100
6+
var R int = 100
7+
8+
// Task 任务
9+
func Task(i int) {
10+
fmt.Println("Box", i)
11+
}
12+
13+
// Workers worker
14+
func Workers(task func(interface{}), climax func()) chan interface{} {
15+
input := make(chan interface{})
16+
ack := make(chan bool)
17+
for i := 0; i < R; i++ {
18+
go func() {
19+
for {
20+
v, ok := <-input
21+
if ok {
22+
task(v)
23+
ack <- true
24+
} else {
25+
return
26+
}
27+
}
28+
}()
29+
}
30+
go func() {
31+
for i := 0; i < R; i++ {
32+
<-ack
33+
}
34+
climax()
35+
}()
36+
return input
37+
}
38+
39+
func main() {
40+
41+
exit := make(chan bool)
42+
43+
workers := Workers(func(a interface{}) {
44+
Task(a.(int))
45+
}, func() {
46+
exit <- true
47+
})
48+
49+
for i := 0; i < N; i++ {
50+
workers <- i
51+
}
52+
close(workers)
53+
54+
<-exit
55+
}

0 commit comments

Comments
 (0)