package main
import (
"fmt"
"runtime"
"time"
)
type GoRoutine struct {
gJobs chan func()
gDone chan struct{}
gWait chan struct{}
gNum int
}
func (g *GoRoutine) Wait() {
select {
case <-g.gWait:
fmt.Println("结束等待")
}
}
func (g *GoRoutine) Done() {
for i := 0; i < g.gNum; i++ {
g.gDone <- struct{}{}
}
close(g.gJobs)
close(g.gDone)
g.gWait <- struct{}{}
close(g.gWait)
fmt.Println("管道关闭")
}
func NewGoRoutine(size int) *GoRoutine {
g := &GoRoutine{
gJobs: make(chan func()),
gDone: make(chan struct{}),
gWait: make(chan struct{}),
gNum: size,
}
for i := 0; i < size; i++ {
go func() {
for {
select {
case job := <-g.gJobs:
job()
case <-g.gDone:
fmt.Println("Goroutine 退出")
return
}
}
}()
}
return g
}
func (g *GoRoutine) Go(job func()) {
g.gJobs <- job
}
func main() {
g := NewGoRoutine(10)
g1 := NewGoRoutine(10)
for i := 0; i < 5; i++ {
g.Go(func() {
//time.Sleep(time.Second * 1)
fmt.Println("协程数:", runtime.NumGoroutine(), time.Now().Unix())
})
}
g1.Go(func() {
})
time.AfterFunc(time.Second*3, func() {
g.Done()
g1.Done()
fmt.Println("协程数:", runtime.NumGoroutine(), time.Now().Unix())
})
time.AfterFunc(time.Second*5, func() {
fmt.Println("协程数:", runtime.NumGoroutine(), time.Now().Unix())
})
g.Wait()
g1.Wait()
time.Sleep(time.Second * 10)
}
go协程复用
最新推荐文章于 2023-06-01 13:49:42 发布