乐趣区

关于golang:Golang浅谈协程并发竞争资源问题

作者: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 也就是格式化的意思。

看看运行后果

R
就
像
e
g
老
鼠
a
n
爱
Y
大
米
u
e

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

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

那么输入后果就是:

就
R
e
g
a
n
Y
u
e

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

那么输入后果就是:

就
R
像
老
鼠
爱
大
米

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

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

就
R

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

如果两个及以上个协程在没有同步的情景上来访问共享的资源,并且尝试同一时间读和写共享的资源。就会呈现资源竞争问题。呈现的这个问题可能让程序变得略微简单,本文就临时不探讨这些简单状况,想晓得的能够关注博主,博主前期会介绍。

咱们也能够应用 go build-race 参数,应用它能够理解 是否存在资源竞争问题,对于 go build-race 参数的应用,本篇博文暂不介绍,前期博主会尽量具体介绍。**


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

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

扫描下方小程序二维码,退出咱们!

退出移动版