怎样理解golang的异步?

ddxx11223 · 2018-02-06 10:30:47 · 3585 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-02-06 10:30:47 的主题,其中的信息可能已经有所发展或是发生改变。

都说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-dede/p/5134636.html


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3585 次点击  
加入收藏 微博
1 回复  |  直到 2018-02-09 13:07:55
dong-hao
dong-hao · #1 · 7年之前

异步代码一般都是回调方式写的,比如

ReadFile(filename, func(stream){
      stream xxx
})

所以,可以认为 golang 是同步的写法实现了异步的效果。 你的那块代码是实现了两个 goroutine 之间的消息同步,对主线程而言,如果没有 time.Sleep 这个强制等待,早就退出了。

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传