iT邦幫忙

2023 iThome 鐵人賽

DAY 8
1
Modern Web

就是個Go,我也可以啦!GOGO系列 第 8

2023鐵人賽Day 8 理解Go設計哲學-2

  • 分享至 

  • xImage
  •  

原生併發,輕量高效

多年來cpu的設計已經從單核面向多核,單核通常是高性能但功耗非常高,但當進入一個多核的時代時獲得了更強大的並行處理能力。這其實讓我想到,當我在寫javascript時我也時常會想使用非同步函示,就好像,一個人能力再強,他都只能一次處理一件事情,若有麻煩的事情,就只能乖乖等他卡完才能繼續
然而go在設計這門語言時,果斷的面相多核,原生內建併發支持

  • go語言採用輕量級協程併發模型,使得go應用在面向多核的硬體時更具有擴展性

當談到不同的語言實作併發方式的不足時,我們常常會遇到以下問題:

  1. 創建容易但退出難:許多語言提供了便捷的方式來創建併發單元(例如線程或協程),但管理它們的生命週期、確保它們正確終止或釋放資源可能會相對困難。這導致了資源洩漏或未正確清理的可能性。

  2. 併發單元間溝通困難:線程間或協程間的通訊可能需要使用複雜的機制,如消息隊列、信號量、管道等。這些機制往往需要精確的設計和實施,以確保正確性和性能。

  3. 資源的佔用和切換代價:如您所提,線程的創建和管理雖然比進程要小,但仍然有相應的資源佔用。每個線程都有自己的堆疊和局部變量,這些都需要內存。此外,當操作系統頻繁地在多個線程之間進行上下文切換時,會有相應的CPU開銷,這可能導致效能下降。

這些問題不只是單一語言的問題,它們是跨語言的。但值得注意的是,許多現代語言和工具已經在這些問題上取得了進展。例如,Go語言的goroutine和channel提供了一個相對簡單的併發模型和線程間通訊方式。Rust語言的所有權和生命週期模型提供了強大的併發和並行工具,並減少了數據競爭的可能性。

然而Go果斷放棄傳統基於操作系統線程的併發模型,而是採用了用戶輕量級線程或是說類線程,稱之為goroutine

  • Go語言默認為每個goroutine分配到空間僅2kb
  • goroutine佔用了資源非常少,而且調度的切換也不用陷入trap操作系統內核層,所以你可以創建成千上萬的併發goroutine

結尾

了解go的設計哲學有助於我們理解我們該怎麼寫這個語言,其實可以用"簡單"貫穿go語言的設計主旨,希望你們可以把複雜的事交給go內部,並輕鬆的寫go


上一篇
2023鐵人賽Day 7 Go設計哲學-1
下一篇
2023鐵人賽 Day 9 Go的資料結構-陣列
系列文
就是個Go,我也可以啦!GOGO30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言