快速导航×

Golang如何使用goroutine实现并发_Golang goroutine并发编程实践2025-11-21 17:51:27
Go语言通过goroutine和channel实现高效并发,使用go关键字启动goroutine;2. 主goroutine不等待其他goroutine,需用sync.WaitGroup同步,通过Add、Done、Wait方法确保所有任务完成。

golang如何使用goroutine实现并发_golang goroutine并发编程实践

Go语言的并发模型基于goroutinechannel,使得编写高并发程序变得简单高效。goroutine是Go运行时调度的轻量级线程,启动成本低,一个Go程序可以轻松启动成千上万个goroutine。

如何启动一个goroutine

在函数或方法调用前加上go关键字,即可让该函数在新的goroutine中执行。

示例:

go func() {<br&gt;
      fmt.Println("Hello from goroutine")<br>
  }()

主goroutine(main函数)不会等待其他goroutine结束。如果主程序退出,所有未完成的goroutine都会被强制终止。

使用WaitGroup同步多个goroutine

当需要等待一组goroutine完成时,可使用sync.WaitGroup进行同步。

常用方法:
  • Add(n):增加计数器
  • Done():计数器减1
  • Wait():阻塞直到计数器为0

示例代码:

var wg sync.WaitGroup<br><br>
  for i := 0; i < 3; i++ {<br>
    wg.Add(1)<br>
    go func(id int) {<br>
      defer wg.Done()<br>
      fmt.Printf("Goroutine %d done\n", id)<br>
    }(i)<br>
  }<br><br>
  wg.Wait() // 等待所有goroutine完成

通过channel进行goroutine间通信

channel是goroutine之间传递数据的安全方式,避免了共享内存带来的竞态问题。

创建channel:

ch := make(chan string)

向channel发送数据:ch <br>从channel接收数据:<code>value :=

带缓冲的channel:

云模块网站管理系统3.1.03 云模块网站管理系统3.1.03

云模块_YunMOK网站管理系统采用PHP+MYSQL为编程语言,搭载自主研发的模块化引擎驱动技术,实现可视化拖拽无技术创建并管理网站!如你所想,无限可能,支持创建任何网站:企业、商城、O2O、门户、论坛、人才等一块儿搞定!永久免费授权,包括商业用途; 默认内置三套免费模板。PC网站+手机网站+适配微信+文章管理+产品管理+SEO优化+组件扩展+NEW Login界面.....目测已经遥遥领先..

云模块网站管理系统3.1.03 0 查看详情 云模块网站管理系统3.1.03

ch := make(chan int, 5) // 缓冲大小为5

缓冲channel非阻塞发送,直到缓冲区满为止。

实际应用示例:生产者-消费者模型

func producer(ch chan<- int) {<br>
    for i := 0; i < 5; i++ {<br>
      ch <- i<br>
      time.Sleep(time.Millisecond * 100)<br>
    }<br>
    close(ch)<br>
  }<br><br>
  func consumer(ch <-chan int, wg *sync.WaitGroup) {<br>
    defer wg.Done()<br>
    for value := range ch {<br>
      fmt.Println("Received:", value)<br>
    }<br>
  }

主函数中启动生产者和消费者:

ch := make(chan int)<br>
  var wg sync.WaitGroup<br><br>
  wg.Add(1)<br>
  go producer(ch)<br>
  go consumer(ch, &wg)<br>
  wg.Wait()

避免常见并发问题

goroutine虽然方便,但也容易引发以下问题:

  • 竞态条件:多个goroutine同时访问共享变量。可通过互斥锁(sync.Mutex)或channel避免。
  • 死锁:goroutine相互等待导致程序挂起。确保channel的发送和接收配对,及时关闭不再使用的channel。
  • 资源泄漏:goroutine一直阻塞未退出。使用context包控制超时或取消。

使用context控制goroutine生命周期:

ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)<br>
  defer cancel()<br><br>
  go func() {<br>
    select {<br>
    case <-time.After(3 * time.Second):<br>
      fmt.Println("Work done")<br>
    case <-ctx.Done():<br>
      fmt.Println("Cancelled due to timeout")<br>
    }<br>
  }()<br><br><-ctx.Done() // 等待上下文结束

基本上就这些。掌握goroutine、channel、WaitGroup和context的组合使用,就能写出稳定高效的并发程序。关键是理解“不要通过共享内存来通信,而应该通过通信来共享内存”这一Go并发哲学。

以上就是Golang如何使用goroutine实现并发_Golang goroutine并发编程实践的详细内容,更多请关注其它相关文章!


# go  # 互联网营销推广网址  # 伊通网站推广  # 网站如何做seo推广优化方案  # 微信网站建设php  # 合作协议人财物营销推广  # 长清区网站建设  # 网站建设创作灵感分析  # 遥遥领先  # 相关文章  # 主程序  # 就能  # 这一  # 大文件  # 死锁  # 多个  # 如何使用  # 网站管理系统  # ai  # go语言  # golang  # 并发编程  # 推广和营销目标  # 宁波营销推广方式  # 襄州网站推广 


相关栏目: 【 企业资讯168 】 【 行业动态20933 】 【 网络营销52431 】 【 网络学院91036 】 【 运营推广7012 】 【 科技资讯60970


相关推荐: Win11 USB传输速度慢怎么解决 Win11 USB驱动更新与设置  解决macOS Tkinter应用双击启动崩溃:PyInstaller打包指南  必由学官网快捷入口 必由学网页版在线学习平台  2025AO3夸克浏览器通道_AO3手机HTTPS安全入口分享  实现分段式页面滚动导航:CSS与J*aScript教程  Windows10怎么开启存储感知 Windows10系统设置自动清理临时文件释放C盘空间【教程】  c++中为什么推荐使用using替代typedef_c++现代化类型别名  LINUX的I/O重定向是什么_深入理解LINUX中 >、>> 与 < 的区别  Pyrogram与g4f集成:异步编程实践与常见错误解决  必由学网页版入口 必由学官方平台直接访问  《铁拳8》黑皮辣妹新实机:元气满满的18岁少女!  为什么我的微信朋友圈看不到别人的更新_微信朋友圈更新显示异常解决方法  如何使用CaptainHook和Composer管理Git钩子_在提交前自动运行代码检查的Composer配置  1688商家版怎样分析买家画像精准供货_1688商家版分析买家画像精准供货【供货策略】  黑鲨3Pro怎样在相册开漫画风滤镜_iPhone黑鲨3Pro相册开漫画风滤镜【趣味滤镜】  vivo浏览器自带的下载器速度慢怎么办 vivo浏览器提升文件下载速度的技巧  HTML5原生日期选择器与jQuery UI:实现日期选择器的联动与程序化控制  Angular Material 垂直步进器:实现底部到顶部排序的教程  C++的std::inclusive_scan和std::exclusive_scan是什么_C++17并行算法中的前缀和计算  ACG动漫视频网入口 ACG动漫*免费正版观看地址  excel如何设置打印缩放_Excel打印页面缩放比例与纸张适配调整教程  如何在CSS中使用浮动制作导航栏_float实现水平菜单  不会效仿卡普空!《铁拳》制作人澄清:不采取赛事付费|直播|  在FastAPI中利用lifespan与依赖注入高效管理Redis连接池  PDF怎么合并PDF并保持格式_PDF合并文件保持排版教程  Yandex搜索引擎官网入口_俄罗斯Yandex免登录一键直达  sublime侧边栏怎么增强功能_SideBarEnhancements for sublime安装与配置  荣耀Play7TPro怎样在信息App置顶客服对话_iPhone荣耀Play7TPro信息App置顶客服对话【优先查看】  《明末:渊虚之羽》设计师谈设计角色:那会刚毕业 充满激情  b站怎么取消点赞_b站点赞取消操作方法  KFC早餐时段怎么领特惠代码_KFC早餐订餐优惠代码获取与使用说明  解决 Express.js 中 PUT 请求密码修改失败的路由配置指南  C++如何打印当前代码行号与文件名_C++预定义宏FILE与LINE的使用  Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践  Win11 BitLocker密码忘了怎么办 Win11找回BitLocker恢复密钥方法【解决】  AI泡沫首次被“刺破”:GPU十年都无法存活!  c++中的const_cast和reinterpret_cast怎么用_c++四种类型转换  魅族20怎样在浏览器开无图省流_iPhone魅族20浏览器开无图省流【流量节省】  AO3最新入口2025公告_AO3中文官网合集  AO3网页版合集入口 Archive of Our Own同人作品浏览指南  age动漫网站入口 age动漫官网直接访问入口  抖音从哪里进入网页版_抖音官方入口链接  必由学在线入口 必由学网页版快速登录入口  PyTorch模型训练准确率不提升:诊断与修复常见指标计算错误  steam官方网页快速访问 steam账号注册全流程  如何修改开机登录密码_Windows账户安全设置超详细教程【必学】  fishbowl官网免费版 fishbowl养鱼网站入口  如何将HTML表格多行数据保存到Google Sheets  163邮箱注册官网 免费申请163个人邮箱  响应式图片在网页设计中的正确实现方法