怎样理解golang的异步?
都说golang,可以用同步的思想写出异步的代码,不知道大家都是如何理解这句话的?
下面这段代码算是这句话的一个例子吗?
func sum(x,y int,c chan int){
time.sleep(5*time.Second)
c <- x + y
}
func another(c chan int){
fmt.Println(<-c) //管道有数据了直接继续执行,相当于异步通知
do something else...
}
func main(){
c := make (chan int)
go sum(24,18,c)
go another(c)
fmt.Println("继续执行")
do something else...
time.Sleep(60*time.Second)
}
此外,再说一下我对同步异步阻塞非阻塞的理解:
阻塞非阻塞:一般用于网络io中,阻塞即需要等待,不会立即返回。非阻塞则会立刻返回。
同步异步:当一个同步调用发出后,调用者要主动去获取调用结果。当一个异步过程调用发出后,实际处理这个调用的部件在完成后,通过消息回调来通知调用者调用的结果。
可以明确的是,阻塞与非阻塞与是否同步异步无关
附赠一个讲解阻塞非阻塞和同步异步挺清楚的一篇文章,传送门:https://www.cnblogs.com/wxl-d...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
用同步的思想写出异步的代码
这句话我在golang
没有听过。如果非要说这个事的话,目前我只知道javascript的async/await
是可以理解为用同步的思想写出异步的代码
。好了,回到问题上来,你的问题这里
用同步的思想写出异步的代码
,golang有是有这个,那就是go关键字
。不管什么操作,都可以加上
go
关键词来实现异步前提是go调度器会把执行权给到你这个协程,一般发生阻塞go调度器就会切换协程
其实你这个例子就很好的说明了这一点啊,
用同步的思想写异步的代码
。也正是因为有阻塞的存在,你这段代码才能够
“同步”地执行
。然后你说,同步和阻塞之间在概念上没有必然的联系,这个话本质上是对的,但是矛盾的双方在一定条件下是能相互转换的:
同步的意思是,后一条指令必须要等待上一条指令执行完成后,才开始运行;异步呢就是,上一条指令启动后,就在“另一个维度”运行了,和下一条指令好像是同时运行的,更为生动的说法,我照搬一下一个百度知道的神比喻:
用你问题中的代码,可以理解为:
所以呢,同步和阻塞还是有那么些联系的(如果你把它们揉在一起的话)。
再说回
golang
,其实你代码中,也就两个go
语句是达到这个效果了的,但相对于fmt.Println("继续执行")
以及后面的代码来说,前两条语句还是异步执行的,并且它不像 javascript 那样只是单线程工作(并发),golang 协程是可以多个同时工作的(并行)emmm……纠正一个,阻塞和非阻塞不是用来描述 IO 的,IO 一定是阻塞的……