golang并发模式work

1 work.go

package work

import (
"sync"
)
type Worker interface {  //定义接口,需实现Task()函数
Task()
}
type Pool struct {          
work chan Worker    //通道,发送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 {  //这种方式从一个chan中取东西, select 是从多个chan中取东西,如果没有则阻塞,只有在通道被关闭时才会终止循环
w.Task()   //执行
}
p.wg.Done()
}()  //多协程运行,
}
return &p
}
func (p *Pool) Run(w Worker){  //向通道发送work,线程运行
p.work<-w
}
func (p* Pool) Shutdown(){
close(p.work)  //关闭通道,线程退出循环
p.wg.Wait()    //等待线程终止

}

2 main.go

package main 

import (
"log"
"sync"
"time"
"ch7/work"
)
var names = [] string {
"steve",
"bob",
"mary",
"therese",
"jason",
}
type namePrinter struct {
name string
}
func (m *namePrinter) Task(){   //实现work接口
log.Println(m.name)
time.Sleep(time.Second)
}
func main() {
p := work.New(2)
var wg sync.WaitGroup
wg.Add(100 * len(names))  //使用100 * len(names)个协程发送work
for i := 0 ;i< 100; i++ {
for _, name := range names {
np := namePrinter {
name: name,
}
go func(){
p.Run(&np)   //向通道发送np,因为是阻塞通道,只有接收后才会返回
wg.Done()
}()
}
}
wg.Wait()  //等待发送协程完毕
p.Shutdown()  //关闭通道
}

猜你喜欢

转载自blog.csdn.net/haolifengwang/article/details/80402749