Golang開發學習筆記

1. 其餘語言關於接口的設計都是實現類服務於接口,而Golang彷佛是方法爲主接口爲輔,能夠先考慮實體再考慮接口。服務器

2. select和switch是類似的,case之間是互斥的。因此超時可在一個一秒超時的timeout goroutine中設置一個sleep(1e9),參數單位是納秒,而後用一個case <-timeout去捕捉超時,這樣就會順利跳出select,再也不去等待其餘的goroutine。函數

是否能夠將總的計算時間降到接近原來的1/N呢?答案是不必定。若是掐秒錶(正常點的話,應該用7.8節中介紹的Benchmark方法),會發現總的執行時間沒有明顯縮短。再去觀察CPU運行狀態,你會發現儘管咱們有16個CPU核心,但在計算過程當中其實只有一個CPU核心處於繁忙狀態,
這是會讓不少Go語言初學者迷惑的問題。線程

官方的答案是,這是當前版本的Go編譯器還不能很智能地去發現和利用多核的優點。雖然咱們確實建立了多個goroutine,而且從運行狀態看這些goroutine也都在並行運行,但實際上全部這些goroutine都運行在同一個CPU核心上,在一個goroutine獲得時間片執行的時候,其餘goroutine都會處於等待狀態。從這一點能夠看出,雖然goroutine簡化了咱們寫並行代碼的過程,但實際上總體運行效率並不真正高於單線程程序。設計

在Go語言升級到默認支持多CPU的某個版本以前,咱們能夠先經過設置環境變量GOMAXPROCS的值來控制使用多少個CPU核心。具體操做方法是經過直接設置環境變量GOMAXPROCS的值,或者在代碼中啓動goroutine以前先調用如下這個語句以設置使用16個CPU核心:runtime.GOMAXPROCS(16)接口

到底應該設置多少個CPU核心呢,其實runtime包中還提供了另一個函數NumCPU()來獲取核心數。能夠看到,Go語言其實已經感知到全部的環境信息,下一版本中徹底能夠利用這些信息將goroutine調度到全部CPU核心上,從而最大化地利用服務器的多核計算能力。拋棄GOMAXPROCS只是個時間問題。編譯器

相關文章
相關標籤/搜索