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

Golang如何使用goroutine实现并发_Golang goroutine并发编程实践

P粉602998670
发布: 2025-11-21 17:51:27
原创
926人浏览过
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>
      fmt.Println("Hello from goroutine")<br>
  }()
登录后复制

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

使用WaitGroup同步多个goroutine

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

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

常用方法:
  • 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 :=

MagicStudio
MagicStudio

图片处理必备效率神器!为你的图片提供神奇魔法

MagicStudio 102
查看详情 MagicStudio

带缓冲的channel:

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并发编程实践的详细内容,更多请关注php中文网其它相关文章!

编程速学教程(入门课程)
编程速学教程(入门课程)

编程怎么学习?编程怎么入门?编程在哪学?编程怎么学才快?不用担心,这里为大家提供了编程速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

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

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