给 GPT 的 Prompts

avatar User

worker.go package gopool

type Worker struct { TaskQueue chan Task }

func NewWorker(taskQueue chan Task) *Worker { return &Worker{ TaskQueue: taskQueue, } }

func (w *Worker) Start() { // Implementation here }

gopool.go package gopool

type 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 方法应该是小写字母开头的,请在后续的代码中注意大小写问题。

avatar DevChat

根据你的反馈,我将 startnewWorker 方法改为了小写字母开头,以表示它们是私有的。同时,我也实现了 AddTaskRelease 方法。

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 完成当前的任务。