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协程池的简单实现
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 前言 go 的 goroutine 提供了一种较线程而言更廉价的方式处理并发场景, go 使用二级线程的模式, 将...
