怎样理解golang的异步?

发布于 2022-09-06 13:18:55 字数 793 浏览 26 评论 0

都说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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

左秋 2022-09-13 13:18:55

用同步的思想写出异步的代码这句话我在golang没有听过。如果非要说这个事的话,目前我只知道javascript的async/await是可以理解为用同步的思想写出异步的代码

好了,回到问题上来,你的问题这里用同步的思想写出异步的代码,golang有是有这个,那就是go关键字
不管什么操作,都可以加上go关键词来实现异步前提是go调度器会把执行权给到你这个协程,一般发生阻塞go调度器就会切换协程

﹏半生如梦愿梦如真 2022-09-13 13:18:55

其实你这个例子就很好的说明了这一点啊,用同步的思想写异步的代码

也正是因为有阻塞的存在,你这段代码才能够 “同步”地执行

然后你说,同步和阻塞之间在概念上没有必然的联系,这个话本质上是对的,但是矛盾的双方在一定条件下是能相互转换的:

同步的意思是,后一条指令必须要等待上一条指令执行完成后,才开始运行;异步呢就是,上一条指令启动后,就在“另一个维度”运行了,和下一条指令好像是同时运行的,更为生动的说法,我照搬一下一个百度知道的神比喻

你给了狗一个包子,然后就走开做别的事去了,过后狗追过来对你说了声谢谢,
或者咬了你一口说,包子有毒。这是异步。

同样你给了狗一个包子后,看着狗把包子吃完,并对你摇尾巴,这个期间你一点别的
事都不做,就等着狗吃完包子。 这是同步。

用你问题中的代码,可以理解为:

你再给了狗一个包子,然后就呆在原地除了等狗啥都不做,过会儿狗追过来对你说了声谢谢,你再心满意足地继续做自己的事情,这就是将异步阻塞后变成的同步。

所以呢,同步和阻塞还是有那么些联系的(如果你把它们揉在一起的话)。

再说回 golang,其实你代码中,也就两个 go 语句是达到这个效果了的,但相对于 fmt.Println("继续执行") 以及后面的代码来说,前两条语句还是异步执行的,并且它不像 javascript 那样只是单线程工作(并发),golang 协程是可以多个同时工作的(并行)

云归处 2022-09-13 13:18:55

emmm……纠正一个,阻塞和非阻塞不是用来描述 IO 的,IO 一定是阻塞的……

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文