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 相关文章推荐
golang判断key是否在map中的代码
Apr 24 Golang
Go语言使用select{}阻塞main函数介绍
Apr 25 Golang
浅谈golang 中time.After释放的问题
May 05 Golang
基于Golang 高并发问题的解决方案
May 08 Golang
Golang生成Excel文档的方法步骤
Jun 09 Golang
手把手教你导入Go语言第三方库
Aug 04 Golang
golang中的struct操作
Nov 11 Golang
Go语言特点及基本数据类型使用详解
Mar 21 Golang
Go并发4种方法简明讲解
Apr 06 Golang
Golang数据类型和相互转换
Apr 12 Golang
golang定时器
Apr 14 Golang
go goth封装第三方认证库示例详解
Aug 14 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
PHP+AJAX实现无刷新注册(带用户名实时检测)
2006/12/02 PHP
php中cookie实现二级域名可访问操作的方法
2014/11/11 PHP
详解 PHP加密解密字符串函数附源码下载
2015/12/18 PHP
php通过PHPExcel导入Excel表格到MySQL数据库的简单实例
2016/10/29 PHP
PHP的imageTtfText()函数深入详解
2021/03/03 PHP
符合标准的js表单提交的代码
2007/09/13 Javascript
JS 判断undefined的实现代码
2009/11/26 Javascript
js固定DIV高度,超出部分自动添加滚动条的简单方法
2013/07/10 Javascript
jquery放大镜效果超漂亮噢
2013/11/15 Javascript
js+css 实现遮罩居中弹出层(随浏览器窗口滚动条滚动)
2013/12/11 Javascript
java和javascript获取word文档的书签位置对比
2014/06/19 Javascript
jQuery中用dom操作替代正则表达式
2014/12/29 Javascript
兼容Firefox的Javascript XSLT 处理XML文件
2014/12/31 Javascript
基于JavaScript实现弹出框效果
2016/02/19 Javascript
js实现精确到秒的日期选择器完整实例
2016/04/30 Javascript
javascript基于原型链的继承及call和apply函数用法分析
2016/12/15 Javascript
bootstrap按钮插件(Button)使用方法解析
2017/01/13 Javascript
BootStrap 表单控件之单选按钮水平排列
2017/05/23 Javascript
web前端vue实现插值文本和输出原始html
2018/01/19 Javascript
webpack之devtool详解
2018/02/10 Javascript
js+css实现红包雨效果
2018/07/12 Javascript
jQuery实现基本隐藏与显示效果的方法详解
2018/09/05 jQuery
vue中v-for通过动态绑定class实现触发效果
2018/12/06 Javascript
vue.js实现的幻灯片功能示例
2019/01/18 Javascript
使用webpack构建应用的方法步骤
2019/03/04 Javascript
在Django的URLconf中进行函数导入的方法
2015/07/18 Python
CSS3 实现弹跳的小球动画
2020/10/26 HTML / CSS
澳大利亚波西米亚风情网上商店:Czarina
2019/03/18 全球购物
食品行业求职人的自我评价
2014/01/19 职场文书
有关水浒传的读书笔记
2015/06/25 职场文书
我的中国梦心得体会范文
2016/01/05 职场文书
高三语文教学反思
2016/02/16 职场文书
2016年安康杯竞赛活动总结
2016/04/05 职场文书
公文格式,规则明细(新手收藏)
2019/07/23 职场文书
深入解析NumPy中的Broadcasting广播机制
2021/05/30 Python
Python 实现Mac 屏幕截图详解
2021/10/05 Python