goroutine 和線程的區別


好久沒寫點兒啥了,強行更新一下。

1,從使用上講

1,goroutine 比線程更輕量級,可以創建十萬、百萬不用擔心資源問題。

2,goroutine 和 chan 搭配使用,實現多線程、高並發 實現起來要方便很多。

3,雖然go的並發用起來很方便,但多線程還是要小心不要產生 數據競態,以及共享鎖還是互斥鎖的選擇問題、並發操作的數據同步問題(多核心,不同的cpu緩存操作,同步到內存使其他協程感知)。

2,從其實現上講

1,從資源上講,線程的棧內存大小一般是固定的一般為2
MB,雖然這個數值可以設置,但是 太大了浪費,太小了容易不夠用。
,
而 goroutine 棧內存是可變的,初始一般為 2KB,隨着需求可以擴大達到1GB。 所以goroutine 十分的輕量級,且能滿足不同的需求。

2,從調度上講,線程的調度由 OS 的內核完成;線程的切換需要CPU寄存器和內存的數據交換,從而切換不同的線程上下文。 其觸發方式為 CPU時鍾。
,
而goroutine 的調度 則比較輕量級,由go自身的調度器完成;其只關心當前go程序內協程的調度;觸發方式為 go內部的事件,time.sleep,通道阻塞,互斥量操作等。

3,協程同線程的關系,有些類似於 線程同進程的關系。
多個協成綁定到同一個線程上,按照一定的調度算法執行。

有理解不對寫錯了的地兒,歡迎批評和指正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM