发布时间:2024-11-21 21:53:04
以下是一个简单的 Golang 进程池实现示例:
```go package main import ( "fmt" "sync" ) type Job struct { id int } type Result struct { job Job sum int } func Worker(wg *sync.WaitGroup, jobs <-chan Job, results chan<- Result) { for job := range jobs { sum := job.id + 2 results <- Result{job, sum} wg.Done() } } func main() { jobs := make(chan Job, 100) results := make(chan Result, 100) var wg sync.WaitGroup poolSize := 5 for i := 0; i < poolSize; i++ { go Worker(&wg, jobs, results) } jobCount := 20 wg.Add(jobCount) for i := 0; i < jobCount; i++ { jobs <- Job{i + 1} } wg.Wait() close(jobs) close(results) for result := range results { fmt.Printf("Job ID: %d, Result: %d\n", result.job.id, result.sum) } } ```1. 定义了 Job 结构体,用于表示任务; 2. 定义了 Result 结构体,用于表示任务的执行结果; 3. Worker 函数为工作线程的入口函数,负责处理任务和发送执行结果; 4. 在主函数中,创建了两个通道分别用于存放任务和执行结果,并使用 sync.WaitGroup 控制任务的执行; 5. 创建了固定大小为 5 的进程池,通过调用 go Worker 启动工作线程; 6. 将 20 个任务分发到进程池中的工作线程中执行; 7. 等待所有任务执行完毕后,关闭任务和结果通道,并输出任务执行结果。
五、总结 通过使用 Golang 进程池,可以有效地提高系统的性能和效率。相比于为每个任务创建一个新的 goroutine,使用进程池能够更好地控制并发度和资源消耗。同时,Golang 的 goroutine 和 channel 机制为进程池的实现提供了便捷和高效的方式。 在实际应用中,可以根据任务的类型和数量来调整进程池的大小,以获取最佳的性能和吞吐量。此外,还可以结合其他常用的并发模式,如线程池、连接池等,以满足不同场景的需求。感谢您阅读本文,希望能对您理解和使用 Golang 进程池有所帮助!