golang怎样应用多核_后端开发

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学问请关注golang教程栏目。

以上就是golang怎样应用多核的细致内容,更多请关注ki4网别的相干文章!

Leave A Comment