Golang线程池实现
在Golang中如何实现一个高效的线程池?目前标准库中没有现成的线程池实现,想了解如何用goroutine和channel来构建。主要遇到以下问题:
- 如何控制并发goroutine的数量?
- 任务队列应该如何设计?
- 如何处理任务的返回值或错误?
- 如何优雅地关闭线程池?
- 是否有现成的第三方库推荐?
2 回复
Golang中通过goroutine和channel实现线程池。使用sync.WaitGroup等待任务完成,通过有缓冲channel控制并发数。可封装任务队列和worker管理,实现资源复用和并发控制。
更多关于Golang线程池实现的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Golang中,可以通过goroutine和channel实现线程池(更准确地说是“goroutine池”),用于管理并发任务并限制资源使用。以下是一个简单示例:
package main
import (
"fmt"
"sync"
)
type Pool struct {
jobs chan func() // 任务队列
workers chan struct{} // 控制并发数
wg sync.WaitGroup
}
// 创建线程池
func NewPool(size int) *Pool {
return &Pool{
jobs: make(chan func()),
workers: make(chan struct{}, size), // 缓冲通道限制并发数
}
}
// 添加任务
func (p *Pool) Submit(task func()) {
p.wg.Add(1)
select {
case p.jobs <- task: // 尝试发送任务
case p.workers <- struct{}{}: // 若无空闲worker则创建新goroutine
go p.worker(task)
}
}
// 工作goroutine
func (p *Pool) worker(task func()) {
defer func() {
<-p.workers // 释放一个worker位置
p.wg.Done()
}()
task() // 执行初始任务
// 持续处理任务队列
for t := range p.jobs {
t()
p.wg.Done()
}
}
// 等待所有任务完成并关闭池
func (p *Pool) Wait() {
close(p.jobs)
p.wg.Wait()
}
// 使用示例
func main() {
pool := NewPool(3) // 创建最多3个goroutine的池
for i := 0; i < 10; i++ {
id := i
pool.Submit(func() {
fmt.Printf("任务%d由goroutine执行\n", id)
})
}
pool.Wait()
}
关键点说明:
workers通道通过缓冲大小控制最大并发数jobs通道用于任务队列,避免goroutine过度创建- 使用
sync.WaitGroup等待所有任务完成 - 通过
close(jobs)优雅关闭工作goroutine
优势:
- 复用goroutine,减少创建销毁开销
- 控制并发数量,避免资源竞争
- 任务队列缓冲,提高吞吐量
可根据需求扩展错误处理、任务超时等功能。

