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 interface{}==nil 的几种坑及原理分析
Apr 24 Golang
golang中的空slice案例
Apr 27 Golang
Golang 实现超大文件读取的两种方法
Apr 27 Golang
goland设置颜色和字体的操作
May 05 Golang
解决golang 关于全局变量的坑
May 06 Golang
Go语言读取txt文档的操作方法
Jan 22 Golang
victoriaMetrics库布隆过滤器初始化及使用详解
Apr 05 Golang
Golang jwt身份认证
Apr 20 Golang
Golang 实现 WebSockets 之创建 WebSockets
Apr 24 Golang
Golang入门之计时器
May 04 Golang
详解Go语言中配置文件使用与日志配置
Jun 01 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使用redis实现统计缓存mysql压力的方法
2015/11/14 PHP
PHP基于方差和标准差计算学生成绩的稳定性示例
2017/07/04 PHP
2007/12/23更新创意无限,简单实用(javascript log)
2007/12/24 Javascript
验证用户是否修改过页面的数据的实现方法
2008/09/26 Javascript
JS无限树状列表实现代码
2011/01/11 Javascript
Jquery实现点击切换图片并隐藏显示内容(2种方法实现)
2013/04/11 Javascript
js操作iframe的一些方法介绍
2013/06/25 Javascript
JavaScript中数组成员的添加、删除介绍
2014/12/30 Javascript
Js可拖拽放大的层拖动特效实现方法
2015/02/25 Javascript
VUEJS实战之利用laypage插件实现分页(3)
2016/06/13 Javascript
javascript中获取元素标签中间的内容的实现方法
2016/10/08 Javascript
初探nodeJS
2017/01/24 NodeJs
ES6中Proxy与Reflect实现重载(overload)的方法
2017/03/30 Javascript
详解Webpack DLL用法以及功能
2017/07/11 Javascript
JS中Attr的用法详解
2017/10/09 Javascript
vue项目中使用axios上传图片等文件操作
2017/11/02 Javascript
vue展示dicom文件医疗系统的实现代码
2018/08/27 Javascript
微信小程序实现获取小程序码和二维码java接口开发
2019/03/29 Javascript
Vue使用Clipboard.JS在h5页面中复制内容实例详解
2019/09/03 Javascript
python leetcode 字符串相乘实例详解
2018/09/03 Python
PyQt5实现简易电子词典
2019/06/25 Python
Django全局启用登陆验证login_required的方法
2020/06/02 Python
Python下划线5种含义代码实例解析
2020/07/10 Python
python switch 实现多分支选择功能
2020/12/21 Python
HQhair美国/加拿大:英国化妆品、美容及美发产品商城
2019/04/15 全球购物
法国最大的在线眼镜店:EasyLunettes
2019/08/26 全球购物
如何设置Java的运行环境
2013/04/05 面试题
预备党员党校学习自我评价分享
2013/11/12 职场文书
企业总经理岗位职责
2014/02/13 职场文书
入学申请自荐信范文
2014/02/26 职场文书
四风对照检查材料思想汇报
2014/09/20 职场文书
考研复习计划
2015/01/19 职场文书
泰山导游词
2015/02/02 职场文书
2016三八妇女节慰问信
2015/11/30 职场文书
vue中data里面的数据相互使用方式
2022/06/05 Vue.js
vue如何在data中引入图片的正确路径
2022/06/05 Vue.js