聞道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月齡必知必會】

推薦閱讀