您好,登錄后才能下訂單哦!
golang默認使用單核單線程,可以通過調整或設置運行參數設置多核多線程支持
runtime.GOMAXPROCS(int) runtime.GOMAXPROCS(runtime.NumCPU()) 直接設置環境變量$GOMAXPROCS
Go從1.5版本開始,默認采用多核執行,默認是你的CPU核心數,以前版本默認為1
那么我們在什么情況下應該用多核心來加速程序,而在什么情況下用單核即可呢?
現在我們用一簡單的程序來說明下:
package mainimport ( "runtime" "fmt" "sync" "database/sql" _ "github.com/go-sql-driver/mysql" "time")//定義任務隊列var waitgroup sync.WaitGroupfunc xtgxiso(num int) { //fmt.Println(num) db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8") if err != nil { fmt.Println(err) } defer db.Close() rows, err := db.Query("select sleep(1) as a") if err != nil { fmt.Println(err) } defer rows.Close() var a string for rows.Next() { err = rows.Scan(&a) if err != nil { fmt.Println(err) } else { //fmt.Println(a) } } waitgroup.Done() //任務完成,將任務隊列中的任務數量-1,其實.Done就是.Add(-1)}func main() { //記錄開始時間 start := time.Now() //設置最大的可同時使用的CPU核數和實際cpu核數一致 runtime.GOMAXPROCS(1) for i := 1; i <= 10; i++ { waitgroup.Add(1) //每創建一個goroutine,就把任務隊列中任務的數量+1 go xtgxiso(i) } waitgroup.Wait() //Wait()這里會發生阻塞,直到隊列中所有的任務結束就會解除阻塞 //記錄結束時間 end := time.Now() //輸出執行時間,單位為秒。 fmt.Println(end.Sub(start).Seconds())}
這個程序是執行十次”select sleep(1) as a“.如果是順序阻塞執行的話,執行時間肯定是10s以上,而我們用的協程不會有這種情況。我們可以修改“runtime.GOMAXPROCS(1)”來設置是單核還是多核心執行。
以上就是golang如何利用多核的詳細內容,更多請關注億速云其它相關文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。