package main
import (
"fmt"
"time"
)
type Task struct {
TaskId int
t func() error
}
// 创建任务
func NewTask(taskId int, f func() error) *Task {
return &Task{
TaskId: taskId,
t: f,
}
}
// 执行任务
func (t *Task) Excute() {
t.t()
}
type GoRoutinePool struct {
WorkerNum int
entryChan chan *Task //对外接收task的入口
jobChan chan *Task //对内准备就绪的队列
}
func NewWorkerPool(work int) *GoRoutinePool {
return &GoRoutinePool{
WorkerNum: work,
entryChan: make(chan *Task),
jobChan: make(chan *Task),
}
}
func (p *GoRoutinePool) Run() {
for i := 0; i < p.WorkerNum; i++ {
go p.work(i)
}
// 将写入的任务放入执行chan
for job := range p.entryChan {
p.jobChan <- job
}
}
func (p *GoRoutinePool) work(workId int) {
for task := range p.jobChan {
task.t()
fmt.Println("执行任务:", task.TaskId)
}
}
func (p *GoRoutinePool) Close() {
if _, ok := <-p.entryChan; ok {
close(p.entryChan)
}
if _, ok := <-p.jobChan; ok {
close(p.jobChan)
}
}
func main() {
p := NewWorkerPool(3)
go func() {
// 模拟任务写入
for {
time.Sleep(time.Second)
p.entryChan <- NewTask(int(time.Now().Unix()), func() error {
//fmt.Println("任务:", i, "", time.Now())
return nil
})
}
}()
p.Run()
defer p.Close()
}
go协程池的简单实现
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 前言 go 的 goroutine 提供了一种较线程而言更廉价的方式处理并发场景, go 使用二级线程的模式, 将...