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缓冲channel和非缓冲channel的区别说明
Apr 25 Golang
golang中切片copy复制和等号复制的区别介绍
Apr 27 Golang
Golang 使用Map实现去重与set的功能操作
Apr 29 Golang
Go 自定义package包设置与导入操作
May 06 Golang
golang 实现并发求和
May 08 Golang
Golang 实现获取当前函数名称和文件行号等操作
May 08 Golang
go语言基础 seek光标位置os包的使用
May 09 Golang
Go中的条件语句Switch示例详解
Aug 23 Golang
Go语言特点及基本数据类型使用详解
Mar 21 Golang
golang用type-switch判断interface的实际存储类型
Apr 14 Golang
Golang map映射的用法
Apr 22 Golang
Go 内联优化让程序员爱不释手
Jun 21 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/01 无线电
php中file_get_contents与curl性能比较分析
2014/11/08 PHP
微信公众平台开发关注及取消关注事件的方法
2014/12/23 PHP
PHP Header失效的原因分析及解决方法
2016/11/16 PHP
使两个iframe的高度与内容自适应,且相等
2006/11/20 Javascript
js对象之JS入门之Array对象操作小结
2011/01/09 Javascript
javascript跑马灯悬停放大效果实现代码
2012/12/12 Javascript
解决Extjs4中form表单提交后无法进入success函数问题
2013/11/26 Javascript
jQuery中innerWidth()方法用法实例
2015/01/19 Javascript
本人自用的global.js库源码分享
2015/02/28 Javascript
JS实现仿QQ效果的三级竖向菜单
2015/09/25 Javascript
浅析javascript函数表达式
2016/02/10 Javascript
AngularJS入门教程之MVC架构实例分析
2016/11/01 Javascript
jQuery中animate()的使用方法及解决$(”body“).animate({“scrollTop”:top})不被Firefox支持的问题
2017/04/04 jQuery
Bootstrap实现各种进度条样式详解
2017/04/13 Javascript
vue数组对象排序的实现代码
2018/06/20 Javascript
vue 项目中使用Loading组件的示例代码
2018/08/31 Javascript
在vue中给列表中的奇数行添加class的实现方法
2018/09/05 Javascript
JS栈stack类的实现与使用方法示例
2019/01/31 Javascript
[01:12:44]VG vs Mineski Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
Python 读取某个目录下所有的文件实例
2018/06/23 Python
Python3实现的判断环形链表算法示例
2019/03/07 Python
Python合并同一个文件夹下所有PDF文件的方法
2019/03/11 Python
Django如何实现网站注册用户邮箱验证功能
2019/08/14 Python
python求平均数、方差、中位数的例子
2019/08/22 Python
python多进程(加入进程池)操作常见案例
2019/10/21 Python
python GUI库图形界面开发之PyQt5计数器控件QSpinBox详细使用方法与实例
2020/02/28 Python
Python getsizeof()和getsize()区分详解
2020/11/20 Python
美国旅游网站:Tours4Fun
2017/02/17 全球购物
大学生入党自我鉴定
2013/10/31 职场文书
服装设计专业求职信
2014/06/16 职场文书
运动会演讲稿50字
2014/08/25 职场文书
2016暑期社会实践新闻稿
2015/11/25 职场文书
基于python制作简易版学生信息管理系统
2021/04/20 Python
如何用PHP实现分布算法之一致性哈希算法
2021/05/26 PHP
新手初学Java List 接口
2021/07/07 Java/Android