實際上協程只是發生在單個程序內部的,要是想充分的發掘多核cpu的潛力,還是需要多程序的支援。
對於多核程式設計,go是天生支援,那麼我們在什麼情況下應該用多核心來加速程式,而在什麼情況下用單核即可呢?
現在我們用一簡單的程式來說明下:
)//定義任務佇列
varwaitgroup sync
.waitgroup
func xtgxiso
(num
int)
defer db
.close
()rows
,err
:=db
.query
("select sleep(1) as a")if
err
!=nil
defer rows
.close
()var
a string
forrows
.next
()else
}waitgroup
.done
()//任務完成,將任務佇列中的任務數量-1,其實.done就是.add(-1)
}func main
()waitgroup
.wait
()//wait()這裡會發生阻塞,直到佇列中所有的任務結束就會解除阻塞
//記錄結束時間
end:=
time
.now
()//輸出執行時間,單位為秒。
fmt.
println
(end
.sub
(start
).seconds
())}這個程式是執行十次」select
sleep(1)
asa「.如果是順序阻塞執行的話,執行時間肯定是10s以上,而我們用的協程不會有這種情況。
我們可以修改「runtime.gomaxprocs(
1)」來設定是單核還是多核心執行,對比結果發現,都是1s多點,有時多核反而會比單核慢些,這是為什麼呢?
這是因為這個程式是io為主的,啟用多核心反而有上下文切換,所以對於以涉及io操作的主的程式啟用多核對於加速程式意義不大.
那麼什麼程式啟用多核呢?我們來看如下程式:
packagemain
import
("runtime"
"fmt"
"sync"
"time"
)//定義任務佇列
varwaitgroup sync
.waitgroup
func xtgxiso
(num
int)
waitgroup
.done
()//任務完成,將任務佇列中的任務數量-1,其實.done就是.add(-1)
}func main
()waitgroup
.wait
()//wait()這裡會發生阻塞,直到佇列中所有的任務結束就會解除阻塞
//記錄結束時間
end:=
time
.now
()//輸出執行時間,單位為秒。
fmt.
println
(end
.sub
(start
).seconds
())}
我們可以通過「runtime.gomaxprocs(
1)」來設定是單核還是多核心執行,對比結果發現,多核明顯比單核快,所以對於cpu的執行上,多核執行加速效果是很明顯的.
golang 多核並行
go語言具有支援高併發的特性,可以很方便地實現多執行緒運算,充分利用多個cpu的效能。眾所周知伺服器的處理器大都是單核頻率較低而核心數較多,對於支援高併發的程式語言,可以充分利用伺服器的多核優勢,從而降低單核壓力,減少效能浪費。go語言實現多核多執行緒併發執行是非常方便的,下面舉個例子 packag...
Golang 在Golang中使用json
由於要開發乙個小型的web應用,而web應用大部分都會使用json作為資料傳輸的格式,所以有了這篇文章。包引用import 用於存放資料的結構體type mydata struct這裡需要注意的就是後面單引號中的內容。json item 這個的作用,就是name欄位在從結構體例項編碼到json資料格...
golang中的mmap使用
mmap的原理參考 下面是乙個簡單的小例子 package main import fmt golang.org x exp mmap func main buff make byte,10 讀入的長度為slice預設的長度,0是offset。缺省長度過長將會用0填充。at.readat buff,...