【转】golang多核的使用
原文:http://www.xtgxiso.com/golang%E5%A4%9A%E6%A0%B8%E7%9A%84%E4%BD%BF%E7%94%A8/
上面是设置, runtime.GOMAXPROCS(4), 下面是 runtime.GOMAXPROCS(1), 执行时间差了4倍。
------------------
对于多核编程,go是天生支持,那么我们在什么情况下应该用多核心来加速程序,而在什么情况下用单核即可呢?
现在我们用一简单的程序来说明下:
package main
import (
"runtime"
"fmt"
"sync"
"database/sql"
_ "github.com/go-sql-driver/mysql"
"time"
)
//定义任务队列
var waitgroup sync.WaitGroup
func 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()
//设置最大的可同时使用线程数
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操作的主的程序启用多线程对于加速程序意义不大,
runtime.GOMAXPROCS(1) 保证了mysql的操作(golang底层走的是非阻塞io)都在一个线程上执行,也就没有了cpu在多个线程之间来回调度。
那么什么程序启用多线程呢?我们来看如下程序:
package main
import (
"runtime"
"fmt"
"sync"
"time"
)
//定义任务队列
var waitgroup sync.WaitGroup
func xtgxiso(num int) {
for i:=1;i<=1000000000;i++{
num = num+i
num = num-i
num = num*i
num = num/i
}
waitgroup.Done() //任务完成,将任务队列中的任务数量-1,其实.Done就是.Add(-1)
}
func main() {
//记录开始时间
start := time.Now()
//设置最大的可同时使用的线程数
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())
}
对比结果发现,多线程比单线程快,所以对于CPU的运行上,多线程运行加速效果是很明显的.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2019-11-06 npm start a http server( 在windows的任意目录上开启一个http server 用来测试html 页面和js代码,不用放到nginx的webroot目录下!!)
2019-11-06 git push 缓存密码和用户名
2019-11-06 git config user.name
2019-11-06 A Beginner’s Guide to Webpack 4 and Module Bundling
2019-11-06 rxjs 入门--环境配置
2019-11-06 Angular CLI behind the scenes, part one
2018-11-06 【理解】column must appear in the GROUP BY clause or be used in an aggregate function