Golang线程池实现

在Golang中如何实现一个高效的线程池?目前标准库中没有现成的线程池实现,想了解如何用goroutine和channel来构建。主要遇到以下问题:

  1. 如何控制并发goroutine的数量?
  2. 任务队列应该如何设计?
  3. 如何处理任务的返回值或错误?
  4. 如何优雅地关闭线程池?
  5. 是否有现成的第三方库推荐?
2 回复

Golang中通过goroutine和channel实现线程池。使用sync.WaitGroup等待任务完成,通过有缓冲channel控制并发数。可封装任务队列和worker管理,实现资源复用和并发控制。

更多关于Golang线程池实现的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Golang中,可以通过goroutinechannel实现线程池(更准确地说是“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()
}

关键点说明:

  1. workers通道通过缓冲大小控制最大并发数
  2. jobs通道用于任务队列,避免goroutine过度创建
  3. 使用sync.WaitGroup等待所有任务完成
  4. 通过close(jobs)优雅关闭工作goroutine

优势:

  • 复用goroutine,减少创建销毁开销
  • 控制并发数量,避免资源竞争
  • 任务队列缓冲,提高吞吐量

可根据需求扩展错误处理、任务超时等功能。

回到顶部