golang协程池

golang 简单的协程池的实现

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
import "sync"

type Worker interface {
Task()
}

type Pool struct {
work chan Worker
wg sync.WaitGroup
}

func New(maxGoroutines int) *Pool {
p := Pool{work: make(chan Worker)}
p.wg.Add(maxGoroutines)
for i := 0; i < maxGoroutines; i++ {
go func() {
for w := range p.work {
w.Task()
}
p.wg.Done()

}()

}
return &p
}

func (p *Pool) Run(w Worker) {
p.work <- w

}

func (p *Pool) Shutdown() {
close(p.work)
p.wg.Wait()
}

使用姿势:

只要实现 Task 的接口就行了

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
package main

import (
"Goexample/workpool/work" // 导入这个已写好协程池包
"log"
"sync"
"time"
)

var names = []string{
"steve", "boy", "girl",
}

type namePrinter struct {
name string
}

func (m *namePrinter) Task() {
log.Println(m.name)
time.Sleep(time.Second)
}

func main() {

var wg sync.WaitGroup
p := work.New(10) // New 10 个协程池

for i := 0; i < 30; i++ {
for _, name := range names {
wg.Add(1)
np := &namePrinter{
name: name,
}
go func() {
p.Run(np)
wg.Done()
}()

}

}

wg.Wait()
p.Shutdown()
}