golang多核的使用

2021-08-10 17:46:40 字數 1941 閱讀 4729

實際上協程只是發生在單個程序內部的,要是想充分的發掘多核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操作的主的程式啟用多核對於加速程式意義不大.

那麼什麼程式啟用多核呢?我們來看如下程式:

package

main

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,...