给 GPT 的 Prompts
User
gopool.go
package gopooltype 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 gopooltype 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() } } }() }
现在我需要你:
- 添加 UT 到 gopool_test.go 中;
- 再添加性能测试代码,看下 Pool 容量为10000时,处理一百万个简单 tasks 耗时需要多久;
- 再添加不使用 GoPool 场景下的性能测试代码,看下直接用 go 开 goroutines 处理一百万个简单 tasks 耗时需要多久。
DevChat
以下是我为 GoPool
添加的单元测试和性能测试代码:
在 gopool_test.go
文件中:
package gopool
import (
"testing"
"time"
)
func TestGoPool(t *testing.T) {
pool := NewGoPool(100)
for i := 0; i < 1000; i++ {
pool.AddTask(func() {
time.Sleep(10 * time.Millisecond)
})
}
pool.Release()
}
func BenchmarkGoPool(b *testing.B) {
pool := NewGoPool(10000)
b.ResetTimer()
for i := 0; i < b.N; i++ {
pool.AddTask(func() {
time.Sleep(10 * time.Millisecond)
})
}
pool.Release()
}
func BenchmarkGoroutines(b *testing.B) {
tasks := make(chan Task, b.N)
for i := 0; i < b.N; i++ {
tasks <- func() {
time.Sleep(10 * time.Millisecond)
}
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
go (<-tasks)()
}
close(tasks)
}
在这个测试中,TestGoPool
测试了 GoPool
的基本功能,即添加任务和释放 Pool。BenchmarkGoPool
和 BenchmarkGoroutines
分别测试了使用 GoPool
和直接使用 goroutines 来处理一百万个简单任务的性能。
请注意,这些测试中的任务都是一个简单的函数,只是简单地休眠了一段时间。在实际的应用中,任务可能会更复杂,所以这些测试结果可能并不能完全反映出 GoPool
在实际应用中的性能。