闻道Go语言,6月龄必知必会( 二 )


闻道Go语言,6月龄必知必会

文章插图
5. goroutine vs async-await表象
  • goroutine由go的原生函数生成,只要前面加上go的语法关键字go(可以有形参,返回值会被忽略) 。
  • await/async语法糖 , 简化了异步编程的姿势;实际会被编译器编译成一个状态机 。
goroutine是在runtime级别深度内置,async-await是在CLR之上基于C#语言构建 。
核心对比首先要知道: 线程是cpu调度的基本单位 , 不管是goroutine还是async-wait机制都是在尝试提高[cpu调度线程的效率] 。
  • go在os内核线程之上,原生支持了轻量级的用户态线程goroutine , 堆栈很?。?开销很小,(存在一个用户态逻辑处理器给线程投喂goroutine) 。
  • C#编译器生成的状态机,转化并管控基于线程池线程的主调任务、异步任务、后继任务 。
两者支持并发的思路有明显差异:
go: 内核态线程切换开销大,故原生提供用户态线程,开销极小 , 天然支持高并发,且不轻易坠落到内核态,是一个革命派的思路 。
C#:async-await针对线程做辗转腾挪 , 高效利用, 是一个改良派的思路 。
异步都具备异步的能力 , go语言没有await的概念,goroutine在等待通道读操作时[挂起自身,并将OS线程释放给另一个goroutine],跟C#执行时遇到await关键字的行为效果是一样的 。
推荐附加阅读
  • https://grantjam.es/concurrency-comparing-golangs-channels-to-c-sharps-asyncawait/
  • https://techstacks.io/posts/6628/go-vs-csharp-part-1-goroutines-vs-async-await
本文限于篇幅,只记录了go语言和C#语言的入门6月龄的核心差异点和重难点,高手绕道,后续会不断完善,请有心人持续关注左下角原文,如果能点赞更是莫大的鼓励 。
【闻道Go语言,6月龄必知必会】

推荐阅读