脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - Golang channel为什么不会阻塞的原因详解

Golang channel为什么不会阻塞的原因详解

2022-07-29 11:08烧麦 212 Golang

这篇文章主要为大家介绍了Golang channel为什么不会阻塞的原因详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

正文

最近在学通道channel,发现一个简单的demo:

?
1
2
3
4
5
6
7
8
9
10
package main
import "fmt"
func main() {
    chanInt := make(chan int)
    go func() {
        chanInt <- 100
    }()
    res := <-chanInt
    fmt.Println(res)
}

输出结果是100,这个没有问题。但是之前在学goroutine的时候有看到过一个例子:

?
1
2
3
4
5
6
7
8
9
package main
import "fmt"
func hello() {
    fmt.Println("Hello Goroutine!")
}
func main() {
    go hello() // 启动另外一个goroutine去执行hello函数
    fmt.Println("main goroutine done!")
}

这个例子输出的只有:main goroutine done! 并没有Hello Goroutine!

看过解释:在程序启动时,Go程序就会为main()函数创建一个默认的goroutine。当main()函数返回的时候该goroutine就结束了,所有在main()函数中启动的goroutine会一同结束

那么这个解释放到第一个例子为什么不适用了?

ps:我得理解是:运行到res := <-chanInt这句会阻塞,直到协程写入通道后,就马上读取,继续执行打印语句。不知道理解的对不对?

然后就是关于阻塞的情况,比如我把第一个例子改一下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main
import (
    "fmt"
    "time"
)
func main() {
    chanInt := make(chan int)
    go func() {
        chanInt &lt;- 100
    }()
    time.Sleep(10 * time.Second)
    res := &lt;-chanInt
    fmt.Println(res)
}

多了time.Sleep(10 * time.Second)等待10秒钟,10秒后输出100,这个没有问题。

然后再看一个例子:

?
1
2
3
4
5
6
func main() {
    chanInt := make(chan int)
    chanInt &lt;- 100
    res := &lt;-chanInt
    fmt.Println(res)
}

这个例子就会死锁,阻塞在chanInt <- 100这句,发现没有接收者所以死锁了,这边不理解的是:睡眠10秒的时候,在这10秒里面为什么不会造成死锁?而最后一个例子一运行马上报死锁?更多关于Golang channel不会阻塞的资料请关注服务器之家其它相关文章!

原文链接:https://segmentfault.com/q/1010000040414910

延伸 · 阅读

精彩推荐
  • Golang使用 Go 语言实现汉诺塔(Hanota)算法

    使用 Go 语言实现汉诺塔(Hanota)算法

    我最近重温了一下《猩球崛起》这部电影。在电影中,凯撒就玩了河内塔游戏。你还有印象吗?其实独自一人玩一些游戏是好难的(译者不知作者为何这么...

    马哥Linux运维9172022-04-18
  • Golang泛型版 Singleflight:Go 中如何防止缓存击穿?

    泛型版 Singleflight:Go 中如何防止缓存击穿?

    并发是 Go 的优势,但并发也需要很好的进行控制。标准库中有 sync 包,经常使用的功能有 sync.Mutex、sync.WaitGroup 等。其实,除了标准库,还有一个官方的扩...

    polarisxu11292021-12-31
  • Golang秒懂Golang匿名函数

    秒懂Golang匿名函数

    所谓匿名函数,就是没有名字的函数,本文重点给大家介绍Golang匿名函数的相关知识,通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的...

    温柔的风4842021-03-30
  • GolangGolang中Set类型的实现方法示例详解

    Golang中Set类型的实现方法示例详解

    这篇文章主要给大家介绍了关于Golang中Set类型实现的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    脚本之家7222020-05-09
  • Golanggolang文件服务器的两种方式(可以访问任何目录)

    golang文件服务器的两种方式(可以访问任何目录)

    这篇文章主要介绍了golang文件服务器的两种方式,可以访问任何目录,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价...

    lxsky12512020-06-09
  • Golanggolang中xorm的基本使用说明

    golang中xorm的基本使用说明

    这篇文章主要介绍了golang中xorm的基本使用说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    yí無所冇10252021-03-09
  • Golang利用golang实现封装trycatch异常处理实例代码

    利用golang实现封装trycatch异常处理实例代码

    Go语言追求简洁优雅,所以go语言不支持传统的 try…catch…finally 这种异常,最近发现了不错的trycatch包,下面这篇文章主要跟大家分享了关于利用golang实现...

    xiaorui3092020-05-07
  • Golanggo开源项目用户名密码验证的逻辑鬼才写法

    go开源项目用户名密码验证的逻辑鬼才写法

    这篇文章主要为大家介绍了go开源项目中发现的一个逻辑鬼才写法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    橫貫八方10492022-07-20