首页 > 后端开发 > Golang > 正文

如何使用Golang实现goroutine并发执行_使用goroutine管理多任务

P粉602998670
发布: 2025-12-21 15:24:41
原创
497人浏览过
Go语言通过goroutine实现轻量级并发,启动成本低(初始栈仅2KB),用go关键字启动,配合sync.WaitGroup协调多个goroutine的执行与等待,避免泄漏和竞态。

如何使用golang实现goroutine并发执行_使用goroutine管理多任务

Go语言通过goroutine实现轻量级并发,无需手动管理线程生命周期,启动成本极低(初始仅2KB),适合高并发多任务场景。关键在于合理启动、协调与终止goroutine,避免泄漏和竞态。

启动goroutine执行独立任务

使用go关键字前缀函数调用即可启动goroutine。它会立即返回,不阻塞主流程:

  • 普通函数:go doWork()
  • 匿名函数:go func() { fmt.Println("task done") }()
  • 带参数传递:go processItem(item)(注意传值而非引用,避免闭包变量复用问题)

等待多个goroutine完成:sync.WaitGroup

当需确保所有子任务执行完毕再继续,用sync.WaitGroup计数协调:

  • 调用wg.Add(n)预设任务数
  • 每个goroutine结束前调用wg.Done()
  • 主goroutine调用wg.Wait()阻塞等待全部完成

示例:启动5个任务并统一等待

Block Survey
Block Survey

BlockSurvey是一个保护隐私和数据安全调查工具,可以让你使用AI来创建调查表单。

Block Survey 71
查看详情 Block Survey

立即学习go语言免费学习笔记(深入)”;

var wg sync.WaitGroup
for i := 0; i < 5; i++ {
    wg.Add(1)
    go func(id int) {
        defer wg.Done()
        fmt.Printf("Task %d finished\n", id)
    }(i)
}
wg.Wait() // 主协程在此暂停,直到5个都调用Done
登录后复制

安全退出与资源清理:使用context.Context

长期运行的goroutine需支持主动取消。用context.WithCancel生成可取消上下文:

  • 主goroutine调用cancel()通知所有监听该context的goroutine退出
  • 子goroutine通过select监听ctx.Done()通道判断是否中止
  • 可在case 分支中执行清理操作(如关闭文件、释放连接)

避免常见陷阱

goroutine易出错点需特别注意:

  • 循环变量捕获错误:for循环中直接go f(i)可能所有goroutine看到同一个i值 → 改为go f(i)传参或go func(val int){...}(i)
  • 主goroutine提前退出:若不等待或不处理Done信号,程序可能在子任务完成前就结束 → 必须用WaitGroup或context控制生命周期
  • 无缓冲channel阻塞:向无缓冲channel发送数据时,若无接收方将永久阻塞goroutine → 确保配对收发,或使用带缓冲channel/select超时

以上就是如何使用Golang实现goroutine并发执行_使用goroutine管理多任务的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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