golang中的并发和并行


Posted in Golang onMay 08, 2021

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 main
import (
	"fmt"
	"runtime"
)
type Vector []float64
func (v Vector) DoSome(p, i, n int, u Vector, c chan int) {
	sum := 0.0
	for ; i < n; i++ {
		sum += u[i]
	}
	v[p] = sum
	c <- 1
}
const NCPU = 4
func (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.0
	for _, 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)
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。如有错误或未考虑完全的地方,望不吝赐教。

Golang 相关文章推荐
一文读懂go中semaphore(信号量)源码
Apr 03 Golang
Go语言带缓冲的通道实现
Apr 26 Golang
go设置多个GOPATH的方式
May 05 Golang
完美解决golang go get私有仓库的问题
May 05 Golang
golang switch语句的灵活写法介绍
May 06 Golang
go语言基础 seek光标位置os包的使用
May 09 Golang
Go中的条件语句Switch示例详解
Aug 23 Golang
深入理解go缓存库freecache的使用
Feb 15 Golang
Golang 字符串的常见操作
Apr 19 Golang
Go语言编译原理之源码调试
Aug 05 Golang
关于golang高并发的实现与注意事项说明
May 08 #Golang
基于Golang 高并发问题的解决方案
May 08 #Golang
使用golang编写一个并发工作队列
May 08 #Golang
Go 在 MongoDB 中常用查询与修改的操作
May 07 #Golang
golang 实现时间戳和时间的转化
May 07 #Golang
Golang Gob编码(gob包的使用详解)
May 07 #Golang
go mod 安装依赖 unkown revision问题的解决方案
You might like
咖啡的种类和口感
2021/03/03 新手入门
功能强大的PHP图片处理类(水印、透明度、旋转)
2015/10/21 PHP
详解PHP对象的串行化与反串行化
2016/01/24 PHP
PHP实现微信退款功能
2018/10/02 PHP
thinkPHP框架乐观锁和悲观锁实例分析
2019/10/30 PHP
Javascript中暂停功能的实现代码
2007/03/04 Javascript
JQuery的html(data)方法与&amp;lt;script&amp;gt;脚本块的解决方法
2010/03/09 Javascript
javascript自动给文本url地址增加链接的方法分享
2014/01/20 Javascript
jQuery中:text选择器用法实例
2015/01/03 Javascript
分享五个有用的jquery小技巧
2015/10/08 Javascript
基于jquery实现复选框全选,反选,全不选等功能
2015/10/16 Javascript
纯javascript移动优先的幻灯片效果
2015/11/02 Javascript
JS实现alert中显示换行的方法
2015/12/17 Javascript
Vue项目中使用jquery的简单方法
2019/05/16 jQuery
Vue中的this.$options.data()和this.$data用法说明
2020/07/26 Javascript
跟老齐学Python之大话题小函数(1)
2014/10/10 Python
Python中使用Inotify监控文件实例
2015/02/14 Python
Python3匿名函数用法示例
2018/07/25 Python
Face++ API实现手势识别系统设计
2018/11/21 Python
对python 树状嵌套结构的实现思路详解
2019/08/09 Python
关于tensorflow的几种参数初始化方法小结
2020/01/04 Python
Keras-多输入多输出实例(多任务)
2020/06/22 Python
基于HTML5 audio元素播放声音jQuery小插件
2011/05/11 HTML / CSS
Aquatalia官网:意大利著名鞋履品牌
2019/09/26 全球购物
业务员岗位职责
2013/11/16 职场文书
教师职称自我鉴定
2014/02/12 职场文书
励志演讲稿范文
2014/04/29 职场文书
档案工作汇报材料
2014/08/21 职场文书
运动会演讲稿50字
2014/08/25 职场文书
人身意外保险授权委托书
2014/10/01 职场文书
2014幼儿园教育教学工作总结
2014/12/17 职场文书
公文写作:教你写“建议书”
2019/05/07 职场文书
PyQt5 QThread倒计时功能的实现代码
2021/04/02 Python
MySQL GRANT用户授权的实现
2021/06/18 MySQL
彻底解决MySQL使用中文乱码的方法
2022/01/22 MySQL
分布式Redis Cluster集群搭建与Redis基本用法
2022/02/24 Redis