当前位置:首页 > 科技  > 软件

如何高效地使用Goroutine,你学会了?

来源: 责编: 时间:2023-11-28 09:33:19 152观看
导读概述Go 语言的强大之处在于其内置的并发支持,而 goroutine 是其并发编程的核心。本文将讨论如何高效使用 goroutine,通过清晰的示例代码和注释,帮助读者更好地理解和应用并发编程。1. 了解 goroutine 的基础goroutine 的

概述

Go 语言的强大之处在于其内置的并发支持,而 goroutine 是其并发编程的核心。sun28资讯网——每日最新资讯28at.com

本文将讨论如何高效使用 goroutine,通过清晰的示例代码和注释,帮助读者更好地理解和应用并发编程。sun28资讯网——每日最新资讯28at.com

sun28资讯网——每日最新资讯28at.com

1. 了解 goroutine 的基础

goroutine 的创建

package mainimport (  "fmt"  "time")func main() {  // 创建并启动goroutine  go func() {    for i := 0; i < 5; i++ {      fmt.Println("Goroutine:", i)      time.Sleep(time.Second)    }  }()  // 主goroutine  for i := 0; i < 3; i++ {    fmt.Println("Main:", i)    time.Sleep(time.Second)  }}

sun28资讯网——每日最新资讯28at.com

2. goroutine 之间的通信

用通道进行通信

package mainimport (  "fmt"  "sync"  "time")func main() {  var wg sync.WaitGroup  ch := make(chan int)  // 启动goroutine发送数据  wg.Add(1)  go func() {    defer wg.Done()    for i := 0; i < 5; i++ {      ch <- i      time.Sleep(time.Second)    }    close(ch)  }()  // 启动goroutine接收数据  wg.Add(1)    go func() {    defer wg.Done()    for num := range ch {      fmt.Println("Received:", num)    }  }()  // 等待所有goroutine执行完毕  wg.Wait()}

sun28资讯网——每日最新资讯28at.com

3. 避免 goroutine 泄漏

使用带缓冲的通道

package mainimport (  "fmt"  "sync")func main() {  var wg sync.WaitGroup  // 创建带缓冲的通道  ch := make(chan int, 3)  // 启动goroutine发送数据  wg.Add(1)  go func() {    defer wg.Done()    for i := 0; i < 5; i++ {      ch <- i    }    close(ch)  }()  // 启动goroutine接收数据  wg.Add(1)  go func() {    defer wg.Done()    for num := range ch {      fmt.Println("Received:", num)    }  }()  // 等待所有goroutine执行完毕  wg.Wait()}

sun28资讯网——每日最新资讯28at.com

4. 控制 goroutine 的数量

使用有限的 goroutine 池

package mainimport (  "fmt"  "sync"  "time")func worker(id int, jobs <-chan int, results chan<- int) {  for j := range jobs {      fmt.Println("Worker", id, "processing job", j)        time.Sleep(time.Second)        results <- j * 2  }}func main() {  const numJobs = 5  const numWorkers = 3  jobs := make(chan int, numJobs)  results := make(chan int, numJobs)  // 启动goroutine池  var wg sync.WaitGroup  for w := 1; w <= numWorkers; w++ {    wg.Add(1)    go func(workerID int) {      defer wg.Done()      worker(workerID, jobs, results)    }(w)  }  // 提供工作  for j := 1; j <= numJobs; j++ {    jobs <- j  }  close(jobs)  // 收集结果  go func() {    wg.Wait()    close(results)  }()  // 输出结果  for res := range results {    fmt.Println("Result:", res)  }}

5. 使用 sync 包进行同步

sync.WaitGroup 等待 goroutine 完成

package mainimport (  "fmt"  "sync"  "time")func main() {  var wg sync.WaitGroup  // 启动多个goroutine  for i := 1; i <= 3; i++ {    wg.Add(1)    go func(id int) {      defer wg.Done()      time.Sleep(time.Second)      fmt.Println("Goroutine", id, "completed")    }(i)  }  // 等待所有goroutine执行完毕  wg.Wait()  fmt.Println("All goroutines completed")}

sun28资讯网——每日最新资讯28at.com

6. 性能调优和注意事项

避免共享状态

package mainimport (  "fmt"  "sync"  "time")func main() {  var mu sync.Mutex  counter := 0  for i := 0; i < 5; i++ {    go func() {      mu.Lock()      defer mu.Unlock()      counter++    }()  }  time.Sleep(time.Second)  fmt.Println("Counter:", counter)}

sun28资讯网——每日最新资讯28at.com

7. 总结

通过本文的例子和讨论,对如何高效使用 goroutine 有了更深入的理解。sun28资讯网——每日最新资讯28at.com

理解 goroutine 的创建、通信、避免泄漏、控制数量、同步等方面的技巧,将有助于读者在实际项目中更好地应用 Go 语言的并发编程特性。sun28资讯网——每日最新资讯28at.com

并发不仅是 Go 语言的一项强大功能,更是构建高性能应用的关键。sun28资讯网——每日最新资讯28at.com

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-34579-0.html如何高效地使用Goroutine,你学会了?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 事务管理 vs. 锁控制:你真的分得清吗?

下一篇: 使用 sync.Cond 来协调并发 goroutine 的访问共享资源

标签:
  • 热门焦点
  • 5月iOS设备性能榜:M1 M2依旧是榜单前五

    5月iOS设备性能榜:M1 M2依旧是榜单前五

    和上个月一样,没有新品发布的iOS设备性能榜的上榜设备并没有什么更替,仅仅只有跑分变化而产生的排名变动,刚刚开始的苹果WWDC2023,推出的产品也依旧是新款Mac Pro、新款Mac Stu
  • Raft算法:保障分布式系统共识的稳健之道

    Raft算法:保障分布式系统共识的稳健之道

    1. 什么是Raft算法?Raft 是英文”Reliable、Replicated、Redundant、And Fault-Tolerant”(“可靠、可复制、可冗余、可容错”)的首字母缩写。Raft算法是一种用于在分布式系统
  • 如何正确使用:Has和:Nth-Last-Child

    如何正确使用:Has和:Nth-Last-Child

    我们可以用CSS检查,以了解一组元素的数量是否小于或等于一个数字。例如,一个拥有三个或更多子项的grid。你可能会想,为什么需要这样做呢?在某些情况下,一个组件或一个布局可能会
  • 零售大模型“干中学”,攀爬数字化珠峰

    零售大模型“干中学”,攀爬数字化珠峰

    文/侯煜编辑/cc来源/华尔街科技眼对于绝大多数登山爱好者而言,攀爬珠穆朗玛峰可谓终极目标。攀登珠峰的商业路线有两条,一是尼泊尔境内的南坡路线,一是中国境内的北坡路线。相
  • “又被陈思诚骗了”

    “又被陈思诚骗了”

    作者|张思齐 出品|众面(ID:ZhongMian_ZM)如今的国产悬疑电影,成了陈思诚的天下。最近大爆电影《消失的她》票房突破30亿断层夺魁暑期档,陈思诚再度风头无两。你可以说陈思诚的
  • 冯提莫签约抖音公会 前“斗鱼一姐”消失在直播间

    冯提莫签约抖音公会 前“斗鱼一姐”消失在直播间

    来源:直播观察提起&ldquo;冯提莫&rdquo;这个名字,很多网友或许听过,但应该不记得她是哪位主播了。其实,作为曾经的&ldquo;斗鱼一姐&rdquo;,冯提莫在游戏直播的年代影响力不输于现
  • 小米MIX Fold 3配置细节曝光:搭载领先版骁龙8 Gen2+罕见5倍长焦

    小米MIX Fold 3配置细节曝光:搭载领先版骁龙8 Gen2+罕见5倍长焦

    这段时间以来,包括三星、一加、荣耀等等有不少品牌旗下的最新折叠屏旗舰都得到了不少爆料,而小米新一代折叠屏旗舰——小米MIX Fold 3此前也屡屡被传
  • OPPO K11搭载高性能石墨散热系统:旗舰同款 性能凉爽释放

    OPPO K11搭载高性能石墨散热系统:旗舰同款 性能凉爽释放

    日前OPPO官方宣布,将于7月25日14:30举办新品发布会,届时全新的OPPO K11将正式与大家见面,将主打旗舰影像,和同档位竞品相比,其最大的卖点就是将配备索尼
  • 电博会与软博会实现

    电博会与软博会实现"线下+云端"的双线融合

    在本次“电博会”与“软博会”双展会利好条件的加持下,既可以发挥展会拉动人流、信息流、资金流实现快速交互流动的作用,继而推动区域经济良性发展;又可以聚
Top
Baidu
map