package main
import (
"fmt"
"sync"
)
type Task struct {
f func() error
}
var wg sync.WaitGroup
type Pool struct {
JobQueue chan Task
WorkerQueue chan chan Task
MaxWorkers int
}
func NewPool(maxWorkers int) *Pool {
return &Pool{
JobQueue: make(chan Task, 10),
WorkerQueue: make(chan chan Task, maxWorkers),
MaxWorkers: maxWorkers,
}
}
func (p *Pool) Run() {
for i := 0; i < p.MaxWorkers; i++ {
worker := NewWorker(i+1, p.WorkerQueue)
worker.Start()
}
go p.dispatch()
}
func (p *Pool) dispatch() {
for {
select {
case job := <-p.JobQueue:
fmt.Println("new job")
worker := <-p.WorkerQueue
fmt.Println("append job")
worker <- job
fmt.Println("after run job")
}
}
}
func (p *Pool) AddTask(task Task) {
p.JobQueue <- task
}
type Worker struct {
id int
WorkerQueue chan chan Task
JobChannel chan Task
quitChan chan struct{}
}
func NewWorker(id int, workerQueue chan chan Task) Worker {
fmt.Println("newWorker")
return Worker{
id: id,
WorkerQueue: workerQueue,
JobChannel: make(chan Task),
quitChan: make(chan struct{}),
}
}
func (w *Worker) Start() {
fmt.Println("worker start")
go func() {
for {
w.WorkerQueue <- w.JobChannel
select {
case task := <-w.JobChannel:
fmt.Printf("worker%d start job", w.id)
task.f()
fmt.Printf("worker%d finished job", w.id)
case <-w.quitChan:
fmt.Printf("worker%d quit", w.id)
return
}
}
}()
}
func (w *Worker) Stop() {
go func() {
w.quitChan <- struct{}{}
}()
}
func Hello() error {
fmt.Println("Hello World")
wg.Done()
return nil
}
func main() {
p := NewPool(5)
p.Run()
for i := 0; i < 10; i++ {
task := Task{
f: Hello,
}
wg.Add(1)
p.AddTask(task)
}
wg.Wait()
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了