好久沒寫點兒啥了,強行更新一下。
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,協程同線程的關系,有些類似於 線程同進程的關系。
多個協成綁定到同一個線程上,按照一定的調度算法執行。
有理解不對寫錯了的地兒,歡迎批評和指正。
