都说golang,可以用同步的思想写出异步的代码,不知道大家都是如何理解这句话的?<br/>
下面这段代码算是这句话的一个例子吗?
```go
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-dede/p/5134636.html
异步代码一般都是回调方式写的,比如
```
ReadFile(filename, func(stream){
stream xxx
})
```
所以,可以认为 golang 是同步的写法实现了异步的效果。
你的那块代码是实现了两个 goroutine 之间的消息同步,对主线程而言,如果没有 time.Sleep 这个强制等待,早就退出了。
#1