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

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

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

概述

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

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

p6m28资讯网——每日最新资讯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)  }}

p6m28资讯网——每日最新资讯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()}

p6m28资讯网——每日最新资讯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()}

p6m28资讯网——每日最新资讯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")}

p6m28资讯网——每日最新资讯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)}

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

7. 总结

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • 一加Ace2 Pro真机揭晓 钛空灰配色质感拉满

    终于,在经过了几波预热之后,一加Ace2 Pro的外观真机图在网上出现了。还是博主数码闲聊站曝光的,这次的外观设计还是延续了一加11的方案,只是细节上有了调整,例如新加入了钛空灰
  • 7月安卓手机性价比榜:努比亚+红魔两款新机入榜

    7月登场的新机有努比亚Z50S Pro和红魔8S Pro,除了三星之外目前唯二的两款搭载超频版骁龙8Gen2处理器的产品,而且努比亚和红魔也一贯有着不错的性价比,所以在本次的性价比榜单
  • Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • 三万字盘点 Spring 九大核心基础功能

    大家好,我是三友~~今天来跟大家聊一聊Spring的9大核心基础功能。话不多说,先上目录:图片友情提示,本文过长,建议收藏,嘿嘿嘿!一、资源管理资源管理是Spring的一个核心的基础功能,不
  • 慕岩炮轰抖音,百合网今何在?

    来源:价值研究所 作者:Hernanderz&ldquo;难道就因为自己的一个产品牛逼了,从客服到总裁,都不愿意正视自己产品和运营上的问题,选择逃避了吗?&rdquo;这一番话,出自百合网联合创
  • 大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • 消息称小米汽车开始筛选交付中心:需至少120个车位

    IT之家 7 月 7 日消息,日前,有微博简介为“汽车行业从业者、长三角一体化拥护者”的微博用户 @长三角行健者 发文表示,据经销商集团反馈,小米汽车目前
  • 首发天玑9200+ iQOO Neo8系列发布首销售价2299元起

    2023年5月23日晚,iQOO Neo8系列正式发布。其中,Neo系列首款Pro之作——iQOO Neo8 Pro强悍登场,限时售价3099元起;价位段最强性能手机iQOO Neo8同期上市
  • 最薄的14英寸游戏笔记本电脑 Alienware X14已可以购买

    2022年1月份在国际消费电子展(CES2022)上首次亮相的Alienware新品——Alienware X14现在已经可以购买了,这款笔记本电脑被誉为世界上最薄的 14 英寸游戏笔
Top