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,减少创建销毁开销
 - 控制并发数量,避免资源竞争
 - 任务队列缓冲,提高吞吐量
 
可根据需求扩展错误处理、任务超时等功能。
        
      
                    
                    
                    
