0

0

Linux 开发:如何使用 Go 协程构建轻量线程池

尊渡假赌尊渡假赌尊渡假赌

尊渡假赌尊渡假赌尊渡假赌

发布时间:2025-11-18 22:35:02

|

297人浏览过

|

来源于php中文网

原创

答案:Go语言通过goroutine和channel可实现轻量级线程池,控制并发数量以避免资源耗尽。核心组件包括任务函数、任务通道、worker数量和WaitGroup。使用固定数量的worker从带缓冲通道中取任务执行,通过Submit提交任务,Shutdown关闭通道并等待完成。示例中创建3个worker、队列大小为10的线程池,用于批量处理任务。该模式适用于文件处理、网络请求控制和定时任务等场景,具有调度开销小、高效利用多核的优势。需注意合理设置worker数、避免Submit阻塞及长时间任务影响复用。

linux 开发:如何使用 go 协程构建轻量线程池

在 Linux 系统开发中,Go 语言的协程(goroutine)配合通道(channel)可以非常方便地实现轻量级线程池,有效控制并发数量,避免资源耗尽。虽然 Go 自身调度器已经高度优化,但在处理大量任务时,限制并发 goroutine 数量依然很有必要。下面介绍如何用 Go 协程构建一个简单高效的线程池。

基本思路:使用 worker + 任务队列

线程池的核心是固定数量的工作协程(worker),它们从一个共享的任务通道中获取任务并执行。主程序通过向通道发送任务来调度执行,从而实现并发控制。

关键组件:

  • 任务函数:需要执行的具体逻辑,通常封装为函数类型
  • 任务通道:用于传递任务,类型为 chan func()
  • Worker 数量:控制并发的 goroutine 数量
  • WaitGroup:等待所有任务完成

实现一个简单的线程池

以下是一个可复用的轻量线程池示例:

package main

import (
    "fmt"
    "sync"
)

type Task func()

type Pool struct {
    workers int
    tasks   chan Task
    wg      sync.WaitGroup
}

func NewPool(workers, queueSize int) *Pool {
    return &Pool{
        workers: workers,
        tasks:   make(chan Task, queueSize),
    }
}

func (p *Pool) Start() {
    for i := 0; i < p.workers; i++ {
        p.wg.Add(1)
        go func() {
            defer p.wg.Done()
            for task := range p.tasks {
                task()
            }
        }()
    }
}

func (p *Pool) Submit(task Task) {
    p.tasks <- task
}

func (p *Pool) Shutdown() {
    close(p.tasks)
    p.wg.Wait()
}

// 使用示例
func main() {
    pool := NewPool(3, 10) // 3 个 worker,队列最多 10 个任务
    pool.Start()

    for i := 0; i < 5; i++ {
        i := i
        pool.Submit(func() {
            fmt.Printf("执行任务 %d\n", i)
        })
    }

    pool.Shutdown()
    fmt.Println("所有任务完成")
}

优势与适用场景

这种模式在 Linux 开发中特别实用,比如:

萤火商城
萤火商城

萤火商城V2.0,是2021年全新推出的一款轻量级、高性能、前后端分离的电商系统,支持微信小程序 + H5+ 公众号 + APP,前后端源码完全开源,看见及所得,完美支持二次开发,可学习可商用,让您快速搭建个性化独立商城。萤火商城V2.0开源版 [uni-app端]如何使用uni-app端一、导入uniapp项目 1. 首先下载HBuilderX并安装,地址:https://www.dcloud

下载
  • 批量处理文件或日志:限制同时打开的文件描述符数量
  • 网络请求并发控制:避免对远程服务造成过大压力
  • 定时任务调度:后台异步执行而不阻塞主线程

由于每个 worker 是一个轻量 goroutine,系统调度开销极小,加上 Go runtime 的多路复用机制,能高效利用多核 CPU。

注意事项

使用时注意以下几点:

  • 任务通道建议设为带缓冲的,避免 Submit 阻塞
  • Submit 不应发生在 Shutdown 之后,否则会 panic
  • 长时间阻塞任务会影响 worker 复用,需合理拆分
  • 可根据需要扩展支持任务返回值或错误处理

基本上就这些。Go 的并发模型让线程池实现变得异常简洁,不需要复杂的锁或条件变量,靠 channel 和 goroutine 就能构建出稳定高效的并发控制结构。不复杂但容易忽略的是合理设置 worker 数量,一般建议根据实际负载和系统资源调整。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

478

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

478

2023.08.10

Go中Type关键字的用法
Go中Type关键字的用法

Go中Type关键字的用法有定义新的类型别名或者创建新的结构体类型。本专题为大家提供Go相关的文章、下载、课程内容,供大家免费下载体验。

233

2023.09.06

go怎么实现链表
go怎么实现链表

go通过定义一个节点结构体、定义一个链表结构体、定义一些方法来操作链表、实现一个方法来删除链表中的一个节点和实现一个方法来打印链表中的所有节点的方法实现链表。

443

2023.09.25

go语言编程软件有哪些
go语言编程软件有哪些

go语言编程软件有Go编译器、Go开发环境、Go包管理器、Go测试框架、Go文档生成器、Go代码质量工具和Go性能分析工具等。本专题为大家提供go语言相关的文章、下载、课程内容,供大家免费下载体验。

246

2023.10.13

0基础如何学go语言
0基础如何学go语言

0基础学习Go语言需要分阶段进行,从基础知识到实践项目,逐步深入。php中文网给大家带来了go语言相关的教程以及文章,欢迎大家前来学习。

692

2023.10.26

Go语言实现运算符重载有哪些方法
Go语言实现运算符重载有哪些方法

Go语言不支持运算符重载,但可以通过一些方法来模拟运算符重载的效果。使用函数重载来模拟运算符重载,可以为不同的类型定义不同的函数,以实现类似运算符重载的效果,通过函数重载,可以为不同的类型实现不同的操作。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

191

2024.02.23

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

228

2024.02.23

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

3

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

相关下载

更多

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 3.5万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号