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 25 Golang
go结构体嵌套的切片数组操作
Apr 28 Golang
Go使用协程交替打印字符
Apr 29 Golang
Golang: 内建容器的用法
May 05 Golang
基于Golang 高并发问题的解决方案
May 08 Golang
go web 预防跨站脚本的实现方式
Jun 11 Golang
golang 实用库gotable的具体使用
Jul 01 Golang
Go 通过结构struct实现接口interface的问题
Oct 05 Golang
Go语言怎么使用变长参数函数
Jul 15 Golang
Go语言编译原理之源码调试
Aug 05 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 cc攻击代码与防范方法
2012/10/18 PHP
php生成唯一的订单函数分享
2015/02/02 PHP
PHP MSSQL 分页实例
2016/04/13 PHP
JS控件autocomplete 0.11演示及下载 1月5日已更新
2007/01/09 Javascript
浅析LigerUi开发中谨慎载入common.css文件
2013/07/09 Javascript
Node.js异步I/O学习笔记
2014/11/04 Javascript
Jquery解析json字符串及json数组的方法
2015/05/29 Javascript
jquery点击缩略图切换视频播放特效代码分享
2015/09/15 Javascript
Javascript中的return作用及javascript return关键字用法详解
2015/11/05 Javascript
以WordPress为例讲解jQuery美化页面Title的方法
2016/05/23 Javascript
微信小程序 JS动态修改样式的实现代码
2017/02/10 Javascript
Ionic + Angular.js实现验证码倒计时功能的方法
2017/06/12 Javascript
js/jquery遍历对象和数组的方法分析【forEach,map与each方法】
2019/02/27 jQuery
js中async函数结合promise的小案例浅析
2019/04/14 Javascript
js获取对象,数组所有属性键值(key)和对应值(value)的方法示例
2019/06/19 Javascript
[38:21]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS LGD-CDEC
2014/05/22 DOTA
[03:01]完美世界DOTA2联赛PWL S2 集锦第二期
2020/12/03 DOTA
python中使用正则表达式的连接符示例代码
2017/10/10 Python
python opencv实现图片旋转矩形分割
2018/07/26 Python
matplotlib 画动态图以及plt.ion()和plt.ioff()的使用详解
2021/01/05 Python
意大利运动服减价商店:ScontoSport
2020/03/10 全球购物
Vuori官网:运动服装的终级表现
2021/01/27 全球购物
新加坡鲜花速递/新加坡网上花店:Ferns N Petals
2020/08/29 全球购物
Java中采用什么结构来捕获、处理异常?各子句的顺序、功能如何
2013/10/07 面试题
环境工程与管理大学毕业生求职信
2013/10/02 职场文书
《狐假虎威》教学反思
2014/02/07 职场文书
《小山羊和小灰兔》教学反思
2014/02/19 职场文书
售后服务承诺书怎么写
2014/05/21 职场文书
建筑学专业自荐书
2014/07/09 职场文书
社区活动策划方案
2014/08/21 职场文书
爱的奉献演讲稿
2014/09/10 职场文书
接待员岗位职责范本
2015/04/15 职场文书
《初涉尘世》读后感3篇
2020/01/10 职场文书
Python 处理表格进行成绩排序的操作代码
2021/07/26 Python
Python使用永中文档转换服务
2022/05/06 Python
python缺失值填充方法示例代码
2022/12/24 Python