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在GRPC中设置client的超时时间
Apr 27 Golang
golang 实现菜单树的生成方式
Apr 28 Golang
Golang中interface{}转为数组的操作
Apr 30 Golang
go设置多个GOPATH的方式
May 05 Golang
完美解决golang go get私有仓库的问题
May 05 Golang
Golang二维数组的使用方式
May 28 Golang
Go 通过结构struct实现接口interface的问题
Oct 05 Golang
简单聊聊Golang中defer预计算参数
Mar 25 Golang
golang三种设计模式之简单工厂、方法工厂和抽象工厂
Apr 10 Golang
Golang 对es的操作实例
Apr 20 Golang
Go gorilla securecookie库的安装使用详解
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自定义的格式化时间示例代码
2013/12/05 PHP
PHP判断变量是否为0的方法
2014/02/08 PHP
php无限极分类递归排序实现方法
2014/11/11 PHP
PHP中的一些常用函数收集
2015/05/26 PHP
Prototype 学习 工具函数学习($方法)
2009/07/12 Javascript
jquery tools系列 expose 学习
2009/09/06 Javascript
Javascript new Date().valueOf()的作用与时间戳由来详解
2013/04/24 Javascript
JS Map 和 List 的简单实现代码
2013/07/08 Javascript
基于JQuery实现的图片自动进行缩放和裁剪处理
2014/01/31 Javascript
JQuery显示隐藏页面元素的方法总结
2015/04/16 Javascript
JS实现的通用表单验证插件完整实例
2015/08/20 Javascript
js验证身份证号有效性并提示对应信息
2015/10/19 Javascript
JavaScript使用DeviceOne开发实战(一) 配置和起步
2015/12/01 Javascript
jQuery-1.9.1源码分析系列(十一)DOM操作续之克隆节点
2015/12/01 Javascript
JS实现鼠标框选效果完整实例
2016/06/20 Javascript
vue-cli中打包图片路径错误的解决方法
2017/10/26 Javascript
babel的使用及安装配置教程
2018/02/22 Javascript
JavaScript中while循环的基础使用教程
2020/08/11 Javascript
[04:48]DOTA2上海特锦赛小组赛第三日 TOP10精彩集锦
2016/02/28 DOTA
Python中列表、字典、元组、集合数据结构整理
2014/11/20 Python
Python制作豆瓣图片的爬虫
2017/12/28 Python
wtfPython—Python中一组有趣微妙的代码【收藏】
2018/08/31 Python
彻彻底底地理解Python中的编码问题
2018/10/15 Python
Python图像滤波处理操作示例【基于ImageFilter类】
2019/01/03 Python
Python实现简单石头剪刀布游戏
2021/01/20 Python
python3.7将代码打包成exe程序并添加图标的方法
2019/10/11 Python
Pytest单元测试框架如何实现参数化
2020/09/05 Python
CSS3 mask 遮罩的具体使用方法
2017/11/03 HTML / CSS
马来西亚时装购物网站:ZALORA马来西亚
2017/03/14 全球购物
一份Java笔试题
2012/02/21 面试题
十八届三中全会个人学习材料
2014/02/13 职场文书
三项教育活动实施方案
2014/03/30 职场文书
银行求职自荐信
2014/06/30 职场文书
大学迎新生欢迎词
2015/09/29 职场文书
《金钱的魔力》教学反思
2016/02/20 职场文书
如何利用python创作字符画
2022/06/25 Python