给 GPT 的 Prompts
User
worker.go
package gopooltype Worker struct { TaskQueue chan Task }
func NewWorker(taskQueue chan Task) *Worker { return &Worker{ TaskQueue: taskQueue, } }
func (w *Worker) Start() { // Implementation here }
gopool.go
package gopooltype Task func()
type GoPool struct { TaskQueue chan Task MaxWorkers int Workers []*Worker }
func NewGoPool(maxWorkers int) *GoPool { return &GoPool{ TaskQueue: make(chan Task), MaxWorkers: maxWorkers, Workers: make([]*Worker, maxWorkers), } }
func (p *GoPool) AddTask(task Task) { // Implementation here }
func (p *GoPool) Release() { // Implementation here }
请继续实现相关方法,同时注意用户只调用 NewGoPool, AddTask 和 Release 三个方法,所以 Start 和 NewWorker 方法应该是小写字母开头的,请在后续的代码中注意大小写问题。
DevChat
根据你的反馈,我将 start
和 newWorker
方法改为了小写字母开头,以表示它们是私有的。同时,我也实现了 AddTask
和 Release
方法。
在 gopool.go
文件中:
package gopool
type Task func()
type GoPool struct {
TaskQueue chan Task
MaxWorkers int
Workers []*Worker
}
func NewGoPool(maxWorkers int) *GoPool {
pool := &GoPool{
TaskQueue: make(chan Task),
MaxWorkers: maxWorkers,
Workers: make([]*Worker, maxWorkers),
}
for i := 0; i < maxWorkers; i++ {
worker := newWorker(pool.TaskQueue)
pool.Workers[i] = worker
worker.start()
}
return pool
}
func (p *GoPool) AddTask(task Task) {
p.TaskQueue <- task
}
func (p *GoPool) Release() {
close(p.TaskQueue)
for _, worker := range p.Workers {
<-worker.TaskQueue
}
}
在 worker.go
文件中:
package gopool
type Worker struct {
TaskQueue chan Task
}
func newWorker(taskQueue chan Task) *Worker {
return &Worker{
TaskQueue: taskQueue,
}
}
func (w *Worker) start() {
go func() {
for task := range w.TaskQueue {
if task != nil {
task()
}
}
}()
}
在这个实现中,NewGoPool
方法会创建指定数量的 Worker
,并启动它们。AddTask
方法会将任务添加到任务队列中,Release
方法会关闭任务队列,并等待所有的 Worker
完成当前的任务。