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 空map和未初始化map的注意事项说明
Apr 29 Golang
Go使用协程交替打印字符
Apr 29 Golang
Golang中interface{}转为数组的操作
Apr 30 Golang
golang 实现时间戳和时间的转化
May 07 Golang
Go遍历struct,map,slice的实现
Jun 13 Golang
入门学习Go的基本语法
Jul 07 Golang
golang实现浏览器导出excel文件功能
Mar 25 Golang
golang连接MySQl使用sqlx库
Apr 14 Golang
golang定时器
Apr 14 Golang
Golang并发工具Singleflight
May 06 Golang
Go Grpc Gateway兼容HTTP协议文档自动生成网关
Jun 16 Golang
Golang gRPC HTTP协议转换示例
Jun 16 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数组
2006/10/09 PHP
用IE远程创建Mysql数据库的简易程序
2006/10/09 PHP
php限制ip地址范围的方法
2015/03/31 PHP
2017年最好用的9个php开发工具推荐(超好用)
2017/10/23 PHP
win10 apache配置虚拟主机后localhost无法使用的解决方法
2018/01/27 PHP
PHP实现的多维数组排序算法分析
2018/02/10 PHP
用JavaScript实现用一个DIV来包装文本元素节点
2014/09/09 Javascript
浅谈javascript函数式编程
2015/09/06 Javascript
JavaScript 实现的checkbox经典实例分享
2016/10/16 Javascript
使用BootStrap实现标签切换原理解析
2017/03/14 Javascript
JavaScript中Object值合并方法详解
2017/12/22 Javascript
JavaScript设计模式之缓存代理模式原理与简单用法示例
2018/08/07 Javascript
小程序实现五星点评效果
2018/11/03 Javascript
js的对象与函数详解
2019/01/21 Javascript
小程序如何支持使用 async/await详解
2019/09/12 Javascript
Vue使用v-viewer实现图片预览
2020/10/21 Javascript
Python WXPY实现微信监控报警功能的代码
2017/10/20 Python
python+pandas分析nginx日志的实例
2018/04/28 Python
python opencv实现图片旋转矩形分割
2018/07/26 Python
Python GUI布局尺寸适配方法
2018/10/11 Python
django+echart绘制曲线图的方法示例
2018/11/26 Python
python 使用matplotlib 实现从文件中读取x,y坐标的可视化方法
2019/07/04 Python
Python Pandas 如何shuffle(打乱)数据
2019/07/30 Python
Pytorch 的损失函数Loss function使用详解
2020/01/02 Python
flask 框架操作MySQL数据库简单示例
2020/02/02 Python
基于python实现操作redis及消息队列
2020/08/27 Python
python 实现socket服务端并发的四种方式
2020/12/14 Python
CSS3中线性颜色渐变的一些实现方法
2015/07/14 HTML / CSS
韩国现代百货官网:Hmall
2018/03/21 全球购物
致长跑运动员广播稿
2014/01/31 职场文书
公司合作协议书范本
2014/04/18 职场文书
党员群众路线剖析材料
2014/10/08 职场文书
元旦晚会主持词开场白
2015/05/28 职场文书
《女娲补天》读后感5篇
2019/12/31 职场文书
深入浅出的讲解:信号调制到底是如何实现的
2022/02/18 无线电
Netty客户端接入流程NioSocketChannel创建解析
2022/03/25 Java/Android