写点什么

【Golang】浅谈协程并发竞争资源问题

  • 2022 年 1 月 04 日
  • 本文字数:1186 字

    阅读完需:约 4 分钟

作者:ReganYue

来源:恒生LIGHT云社区

浅谈协程并发竞争资源问题

大家好,这里是努力变得优秀的 R 君,这次我们继续来进行 Golang 系列《让我们一起 Golang》,本次我们来浅谈协程并发竞争资源问题,这也是一个比较容易理解的知识点,我们来看一看吧!


我们在实际操作过程中,往往会遇到拥有多条协程并发的情况,那么当多条协程并发时,协程之间是如何竞争有限的资源的呢?本文将介绍有关内容。


我们先看一看本文实例代码的主函数,两条子协程,主协程 3 秒后结束。


func main() {    go fun1()    go fun2()
time.Sleep(3 * time.Second)}
复制代码


再看看看两条子协程分别是干些什么吧!


func fun1(){    //遍历字符串的每一个字符    for _,c:=range "就像老鼠爱大米"{        //如果这里使用Println的话,输出的会是字符在字符集中的编号。        //这里f是format也就是格式的意思。        fmt.Printf("%c\n",c)        //runtime.Goexit()        //每隔一纳秒打印一个字。        time.Sleep(time.Nanosecond)    }
}
func fun2(){ for _,c := range"ReganYue"{ fmt.Printf("%c\n",c) //runtime.Goexit() time.Sleep(time.Nanosecond)
}}
复制代码


fun1 函数,是遍历输出"就像老鼠爱大米",值得注意的是,这里使用 for...range 循环遍历字符串的话,不能使用 fmt.Println,因为如果这里使用 Println的话,输出的会是字符在字符集中的编号。


fmt.Printf** 这里 f 是 format 也就是格式化的意思。**


看看运行结果


ReganYue
复制代码


发现两条协程运行的结果均匀分布。这就说明两条协程公平竞争资源,两条协程之间实力旗鼓相当。


可如果激活 fun1 内的 runtime.Goexit()


那么输出结果就是:


ReganYue
复制代码


如果激活 fun2 内的 runtime.Goexit()


那么输出结果就是:


R
复制代码


因为 Goexit杀掉它的 goroutine,其他 goroutine 也不会受到影响。所以当 fun1 的所在的子协程被杀死时,不会影响 fun2 所在的子协程的正常运行。


如果本段代码中两个 runtime.Goexit()都激活,那么两条协程都只会输出一个字符。


R
复制代码


因为两条协程在输出完一个字符后就被杀死了。


如果两个及以上个协程在没有同步的情形下去访问共享的资源,并且尝试同一时间读和写共享的资源。就会出现资源竞争问题。出现的这个问题能够让程序变得稍微复杂,本文就暂时不讨论这些复杂情况,想知道的可以关注博主,博主后期会介绍。


我们也可以使用 go build-race 参数,使用它可以了解是否存在资源竞争问题**,关于 go build-race 参数的使用,本篇博文暂不介绍,后期博主会尽量详细介绍。**




想向技术大佬们多多取经?开发中遇到的问题何处探讨?如何获取金融科技海量资源?


恒生LIGHT云社区,由恒生电子搭建的金融科技专业社区平台,分享实用技术干货、资源数据、金融科技行业趋势,拥抱所有金融开发者。


扫描下方小程序二维码,加入我们!



发布于: 2 小时前
用户头像

还未添加个人签名 2018.11.07 加入

还未添加个人简介

评论

发布
暂无评论
【Golang】浅谈协程并发竞争资源问题