golang多核的使用

来源:互联网 发布:asp.net erp源码 编辑:程序博客网 时间:2024/06/05 10:10

实际上协程只是发生在单个进程内部的,要是想充分的发掘多核CPU的潜力,还是需要多进程的支持。


对于多核编程,go是天生支持,那么我们在什么情况下应该用多核心来加速程序,而在什么情况下用单核即可呢?

现在我们用一简单的程序来说明下:

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)”来设置是单核还是多核心执行,对比结果发现,都是1s多点,有时多核反而会比单核慢些,这是为什么呢?

这是因为这个程序是IO为主的,启用多核心反而有上下文切换,所以对于以涉及IO操作的主的程序启用多核对于加速程序意义不大.

那么什么程序启用多核呢?我们来看如下程序:

package mainimport (        "runtime"        "fmt"        "sync""time")//定义任务队列var waitgroup sync.WaitGroupfunc xtgxiso(num int) {      for i:=1;i<=1000000000;i++{num = num+inum = num-inum = num*inum = num/i}        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())}

我们可以通过“runtime.GOMAXPROCS(1)”来设置是单核还是多核心执行,对比结果发现,多核明显比单核快,所以对于CPU的运行上,多核运行加速效果是很明显的.

原创粉丝点击