golang中默认使用一个CPU,这时程序无法并发,只能是并发。因为始终只有一个CPU在运行。
package main import ( 'fmt' 'runtime') //并发和并行var quit chan int = make(chan int) func loop() { for i := 0; i < 100; i++ { //为了观察,跑多些 fmt.Printf('%d ', i) } quit <- 0} func main() { runtime.GOMAXPROCS(2) // 最多使用2个核 go loop() go loop() for i := 0; i < 2; i++ { <- quit }}
runtime.GOMAXPROCS(2) 设置使用2个CPU,这才真正是并行。
补充:Go多核并行化
通过goroutine创建相同逻辑CPU核心个数的协程,将求和列表分段,分别计算后汇总。
通过runtime.NUMCPU()获得逻辑CPU个数,并计算每个协程中计算列表的下标,计算完成后,向channel中写入1。
通过向channel中读取int的个数,判断协程运行是否全部完成,之后求和即可。
package mainimport ('fmt''runtime')type Vector []float64func (v Vector) DoSome(p, i, n int, u Vector, c chan int) {sum := 0.0for ; i < n; i++ {sum += u[i]}v[p] = sumc <- 1}const NCPU = 4func (v Vector) DoAll(u Vector) {c := make(chan int, NCPU)for i := 0; i < NCPU; i++ {fmt.Println(i, i*len(u)/NCPU, (i+1)*len(u)/NCPU)go v.DoSome(i, i*len(u)/NCPU, (i+1)*len(u)/NCPU, u, c)}for i := 0; i < NCPU; i++ {<-c}sum := 0.0for _, value := range v {sum += value}fmt.Println(sum)}func main() {u := make([]float64, 64)for i := 0; i < 64; i++ {u[i] = float64(i)}var v Vector = make([]float64, NCPU)v.DoAll(u)ncpu := runtime.NumCPU()fmt.Println(ncpu)}
以上为个人经验,希望能给大家一个参考,也希望大家多多支持优爱好网。如有错误或未考虑完全的地方,望不吝赐教。
相关文章:
1. Flutter刷新组件RefreshIndicator自定义样式demo2. requestAnimationFrame使用示例详解3. 使用uniapp打包微信小程序时主包和vendor.js过大解决(uniCloud的插件分包)4. JavaScript实现获取图片文件真实格式的示例代码5. uniapp自定义验证码输入框并隐藏光标6. 详解JavaScript中原始数据类型Symbol的使用7. JavaScript深拷贝方法structuredClone使用8. uniapp 手机验证码输入框实现代码(随机数、倒计时、隐藏手机号码中间四位)可以直接使用9. js的一些潜在规则使用分析10. js的一些潜在规则示例分析