Golang channel为什么不会阻塞的原因详解
最近在学通道channel,发现一个简单的demo:
package main
import "fmt"
func main() {
chanInt := make(chan int)
go func() {
chanInt <- 100
}()
res := <-chanInt
fmt.Println(res)
}
输出结果是100,这个没有问题。但是之前在学goroutine的时候有看到过一个例子:
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这句会阻塞,直到协程写入通道后,就马上读取,继续执行打印语句。不知道理解的对不对?
然后就是关于阻塞的情况,比如我把第一个例子改一下:
package main
import (
"fmt"
"time"
)
func main() {
chanInt := make(chan int)
go func() {
chanInt <- 100
}()
time.Sleep(10 * time.Second)
res := <-chanInt
fmt.Println(res)
}
多了time.Sleep(10 * time.Second)等待10秒钟,10秒后输出100,这个没有问题。
然后再看一个例子:
func main() {
chanInt := make(chan int)
chanInt <- 100
res := <-chanInt
fmt.Println(res)
}
这个例子就会死锁,阻塞在chanInt <- 100这句,发现没有接收者所以死锁了,这边不理解的是:睡眠10秒的时候,在这10秒里面为什么不会造成死锁?而最后一个例子一运行马上报死锁?更多关于Golang channel不会阻塞的资料请关注易知道(ezd.cc)其它相关文章!
相关内容
-
golang代理怎么设置
golang代理怎么设置,代理,请求,设置,语言,客户端,应用程序,Go语言(或...
-
什么是golang
什么是golang,语言,执行,编程语言,机器语言,高级语言,运行,golang是...
-
用golang chromedp 操作已经打开的chrome浏览器
用golang chromedp 操作已经打开的chrome浏览器,代码,命令,win...
-
Golang之wait.Until 简单测试用例
Golang之wait.Until 简单测试用例,结束,主程序,测试目的,验证wa...
-
使用Golang实现简单Ping过程
使用Golang实现简单Ping过程,报文,字节,摘要: Ping的基本原理...
-
XP系统下cc_channel_XXXX.exe进程占用CPU过高如
XP系统下cc_channel_XXXX.exe进程占用CPU过高如何解决,任务管...
-
golang二进制读写文件-二进制文件
golang二进制读写文件-二进制文件有些时候,我突然想知道MySQL...
-
Golang Web学习(15)——文件上传-上传文件
Golang Web学习(15)——文件上传-上传文件介绍在web开发中,对于...
-
Golang开发的全功能单文件Web服务器-文件服务器
Golang开发的全功能单文件Web服务器-文件服务器最新HTTP/2标...
-
GoLang下载安装-bin文件安装
GoLang下载安装-bin文件安装GoLang IDEA https://www.jetbra...
-
Go Web 框架 Gin 实践 1—Golang 介绍与 Gin 环
Go Web 框架 Gin 实践 1—Golang 介绍与 Gin 环境安装-bin文...
-
Golang 学习笔记(08)——文件操作-bin文件格式
Golang 学习笔记(08)——文件操作-bin文件格式path在path包中...
-
Golang gRPC HTTP协议转换示例
Golang gRPC HTTP协议转换示例gRPC HTTP协议转换
正当有这... -
golang高并发系统限流策略漏桶和令牌桶算法源码
golang高并发系统限流策略漏桶和令牌桶算法源码剖析目录前言...
-
Golang泛型的使用方法详解
Golang泛型的使用方法详解目录1. 泛型是什么2. 泛型的简单使...