golang默認(rèn)使用單核單線程,可以通過(guò)調(diào)整或設(shè)置運(yùn)行參數(shù)設(shè)置多核多線程支持
runtime.GOMAXPROCS(int) runtime.GOMAXPROCS(runtime.NumCPU()) 直接設(shè)置環(huán)境變量$GOMAXPROCS
Go從1.5版本開(kāi)始,默認(rèn)采用多核執(zhí)行,默認(rèn)是你的CPU核心數(shù),以前版本默認(rèn)為1
那么我們?cè)谑裁辞闆r下應(yīng)該用多核心來(lái)加速程序,而在什么情況下用單核即可呢?
現(xiàn)在我們用一簡(jiǎn)單的程序來(lái)說(shuō)明下:
package mainimport ( "runtime" "fmt" "sync" "database/sql" _ "github.com/go-sql-driver/mysql" "time")//定義任務(wù)隊(duì)列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() //任務(wù)完成,將任務(wù)隊(duì)列中的任務(wù)數(shù)量-1,其實(shí).Done就是.Add(-1)}func main() { //記錄開(kāi)始時(shí)間 start := time.Now() //設(shè)置最大的可同時(shí)使用的CPU核數(shù)和實(shí)際cpu核數(shù)一致 runtime.GOMAXPROCS(1) for i := 1; i <= 10; i++ { waitgroup.Add(1) //每創(chuàng)建一個(gè)goroutine,就把任務(wù)隊(duì)列中任務(wù)的數(shù)量+1 go xtgxiso(i) } waitgroup.Wait() //Wait()這里會(huì)發(fā)生阻塞,直到隊(duì)列中所有的任務(wù)結(jié)束就會(huì)解除阻塞 //記錄結(jié)束時(shí)間 end := time.Now() //輸出執(zhí)行時(shí)間,單位為秒。 fmt.Println(end.Sub(start).Seconds())}
這個(gè)程序是執(zhí)行十次”select sleep(1) as a“.如果是順序阻塞執(zhí)行的話(huà),執(zhí)行時(shí)間肯定是10s以上,而我們用的協(xié)程不會(huì)有這種情況。我們可以修改“runtime.GOMAXPROCS(1)”來(lái)設(shè)置是單核還是多核心執(zhí)行。