多年來cpu的設計已經從單核面向多核,單核通常是高性能但功耗非常高,但當進入一個多核的時代時獲得了更強大的並行處理能力。這其實讓我想到,當我在寫javascript時我也時常會想使用非同步函示,就好像,一個人能力再強,他都只能一次處理一件事情,若有麻煩的事情,就只能乖乖等他卡完才能繼續
然而go在設計這門語言時,果斷的面相多核,原生內建併發支持
當談到不同的語言實作併發方式的不足時,我們常常會遇到以下問題:
創建容易但退出難:許多語言提供了便捷的方式來創建併發單元(例如線程或協程),但管理它們的生命週期、確保它們正確終止或釋放資源可能會相對困難。這導致了資源洩漏或未正確清理的可能性。
併發單元間溝通困難:線程間或協程間的通訊可能需要使用複雜的機制,如消息隊列、信號量、管道等。這些機制往往需要精確的設計和實施,以確保正確性和性能。
資源的佔用和切換代價:如您所提,線程的創建和管理雖然比進程要小,但仍然有相應的資源佔用。每個線程都有自己的堆疊和局部變量,這些都需要內存。此外,當操作系統頻繁地在多個線程之間進行上下文切換時,會有相應的CPU開銷,這可能導致效能下降。
這些問題不只是單一語言的問題,它們是跨語言的。但值得注意的是,許多現代語言和工具已經在這些問題上取得了進展。例如,Go語言的goroutine和channel提供了一個相對簡單的併發模型和線程間通訊方式。Rust語言的所有權和生命週期模型提供了強大的併發和並行工具,並減少了數據競爭的可能性。
然而Go果斷放棄傳統基於操作系統線程的併發模型,而是採用了用戶輕量級線程或是說類線程,稱之為goroutine
了解go的設計哲學有助於我們理解我們該怎麼寫這個語言,其實可以用"簡單"貫穿go語言的設計主旨,希望你們可以把複雜的事交給go內部,並輕鬆的寫go