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 原生http web 服务跨域restful api的写法介绍
Apr 27 Golang
基于Go Int转string几种方式性能测试
Apr 28 Golang
golang 在windows中设置环境变量的操作
Apr 29 Golang
Go语言 go程释放操作(退出/销毁)
Apr 30 Golang
Go 在 MongoDB 中常用查询与修改的操作
May 07 Golang
浅谈Golang 切片(slice)扩容机制的原理
Jun 09 Golang
golang内置函数len的小技巧
Jul 25 Golang
Go语言基础map用法及示例详解
Nov 17 Golang
简单聊聊Golang中defer预计算参数
Mar 25 Golang
Golang数据类型和相互转换
Apr 12 Golang
golang生成并解析JSON
Apr 14 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
PHP 字符截取 解决中文的截取问题,不用mb系列
2009/09/29 PHP
php cli 小技巧
2013/06/03 PHP
php-redis中的sort排序函数总结
2015/07/08 PHP
php+html5实现无刷新图片上传教程
2016/01/22 PHP
PHP中通过getopt解析GNU C风格命令行选项
2019/11/18 PHP
VBScript版代码高亮
2006/06/26 Javascript
ext监听事件方法[初级篇]
2008/04/27 Javascript
关于jquery中全局函数each使用介绍
2013/12/10 Javascript
JavaScript对象之深度克隆介绍
2014/12/08 Javascript
Jquery 垂直多级手风琴菜单附源码下载
2015/11/17 Javascript
JQuery移动页面开发之屏幕方向改变与滚屏的实现
2015/12/03 Javascript
深入理解jquery中的each用法
2016/12/14 Javascript
Vue.directive自定义指令的使用详解
2017/03/10 Javascript
vue loadmore 组件滑动加载更多源码解析
2017/07/19 Javascript
JavaScript中this关键字用法实例分析
2018/08/24 Javascript
使用vue2.6实现抖音【时间轮盘】屏保效果附源码
2019/04/24 Javascript
微信小程序 轮播图实现原理及优化详解
2019/09/29 Javascript
JavaScript 浏览器对象模型BOM原理与常见用法实例分析
2019/12/16 Javascript
[00:10]DOTA2全国高校联赛速递
2018/05/30 DOTA
[01:08:30]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第一场 2月28日
2021/03/11 DOTA
python使用xlrd实现检索excel中某列含有指定字符串记录的方法
2015/05/09 Python
解决python中os.listdir()函数读取文件夹下文件的乱序和排序问题
2018/10/17 Python
python3 unicode列表转换为中文的实例
2018/10/26 Python
Django框架orM与自定义SQL语句混合事务控制操作
2019/06/27 Python
Python3网络爬虫开发实战之极验滑动验证码的识别
2019/08/02 Python
Python assert关键字原理及实例解析
2019/12/13 Python
如何对python的字典进行排序
2020/06/19 Python
Python3+selenium配置常见报错解决方案
2020/08/28 Python
什么是ARP(Address Resolution Protocol)地址解析协议
2013/10/31 面试题
测试工程师岗位职责
2013/11/28 职场文书
高校辅导员推荐信范文
2013/12/25 职场文书
居委会个人对照检查材料思想汇报
2014/09/29 职场文书
三严三实学习心得体会
2014/10/13 职场文书
计划生育个人总结
2015/03/02 职场文书
如何书写先进事迹材料?
2019/07/02 职场文书
只用20行Python代码实现屏幕录制功能
2021/06/02 Python