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的运行上,多核运行加速效果是很明显的.
阅读全文
0 0
- golang多核的使用
- 【golang】golang redis 的使用
- 测试golang中的多核多线程
- 测试golang中的多核多线程
- golang的channel使用
- Beanstalkd的使用(Golang)
- golang-beego的使用
- Golang的使用心得
- golang buffer的使用
- golang panic的使用
- golang channel 的使用
- golang JSON的使用
- Golang简单的template使用
- 说说Golang的使用心得
- Golang中Switch的使用
- golang rc4加密算法的使用
- 使用golang遇到的坑
- golang channel的使用技巧
- git 多人协作的工作模式
- 在读自考期间,我用VB6.0制作的一个搜索本机文件的软件,小软件,实用。
- 数据结构与算法分析(Java语言描述)(15)—— 二分查找(递归与非递归)
- 逻辑思维1
- Python之json类型数据转换
- golang多核的使用
- 30天高效练习---总览
- 15道使用频率极高的基础算法题
- UGUI灰度处理
- Linux 命令小积累
- 字符串常用的方法(备忘)
- Pugixml一种快速解析XML文件的开源解析库《转载》
- bad ELF interpreter: No such file or directory
- 征信的3个谣言,我不说你肯定都信了!