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语言map与string的相互转换的实现
Apr 07 Golang
golang 实现菜单树的生成方式
Apr 28 Golang
对Golang中的FORM相关字段理解
May 02 Golang
Go标准容器之Ring的使用说明
May 05 Golang
浅谈golang package中init方法的多处定义及运行顺序问题
May 06 Golang
关于golang高并发的实现与注意事项说明
May 08 Golang
深入理解go缓存库freecache的使用
Feb 15 Golang
golang生成vcf通讯录格式文件详情
Mar 25 Golang
golang生成并解析JSON
Apr 14 Golang
Golang获取List列表元素的四种方式
Apr 20 Golang
Golang ort 中的sortInts 方法
Apr 24 Golang
Go语言测试库testify使用学习
Jul 23 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 date函数参数详解
2006/11/27 PHP
PHP之生成GIF动画的实现方法
2013/06/07 PHP
PHP操作Memcache实例介绍
2013/06/14 PHP
安装ImageMagick出现error while loading shared libraries的解决方法
2014/09/23 PHP
PHP使用ob_start生成html页面的方法
2014/11/07 PHP
PHP实现获取文件后缀名的几种常用方法
2015/08/08 PHP
PHP使用栈解决约瑟夫环问题算法示例
2017/08/27 PHP
jquery1.4后 jqDrag 拖动 不可用
2010/02/06 Javascript
jquery选择器的选择使用及性能介绍
2013/01/16 Javascript
JQueryEasyUI Layout布局框架的使用
2013/04/08 Javascript
用js调用迅雷下载代码的二种方法
2013/04/15 Javascript
jquery实现表格本地排序的方法
2015/03/11 Javascript
JS基于cookie实现来宾统计记录访客信息的方法
2015/08/04 Javascript
实例剖析AngularJS框架中数据的双向绑定运用
2016/03/04 Javascript
Bootstrap每天必学之导航组件
2016/04/25 Javascript
EasyUI折叠表格层次显示detailview详解及实例
2016/12/28 Javascript
关于TypeScript中import JSON的正确姿势详解
2017/07/25 Javascript
js使用ajax传值给后台,后台返回字符串处理方法
2018/08/08 Javascript
layer弹窗在键盘按回车将反复刷新的实现方法
2019/09/25 Javascript
使用Taro实现小程序商城的购物车功能模块的实例代码
2020/06/05 Javascript
为什么JavaScript中0.1 + 0.2 != 0.3
2020/12/03 Javascript
python里使用正则表达式的组嵌套实例详解
2017/10/24 Python
利用python对Excel中的特定数据提取并写入新表的方法
2018/06/14 Python
在django admin中添加自定义视图的例子
2019/07/26 Python
python匿名函数用法实例分析
2019/08/03 Python
Python模块汇总(常用第三方库)
2019/10/07 Python
python json.dumps中文乱码问题解决
2020/04/01 Python
python交互模式基础知识点学习
2020/06/18 Python
Html5与App的通讯方式详解
2019/10/24 HTML / CSS
moosejaw旗下的户外商品促销网站:Mountain Steals
2017/02/27 全球购物
领导的自我鉴定
2013/12/28 职场文书
财务专业大学生职业生涯规划范文
2013/12/30 职场文书
优秀信贷员先进事迹
2014/01/31 职场文书
《美丽的公鸡》教学反思
2014/02/25 职场文书
护士上岗前培训自我鉴定
2014/04/20 职场文书
springboot使用Redis作缓存使用入门教程
2021/07/25 Redis