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 嵌套 interface 的赋值问题
Apr 29 Golang
解决Golang中goroutine执行速度的问题
May 02 Golang
golang switch语句的灵活写法介绍
May 06 Golang
go mod 安装依赖 unkown revision问题的解决方案
May 06 Golang
基于Golang 高并发问题的解决方案
May 08 Golang
Go语言设计模式之结构型模式
Jun 22 Golang
基于Go语言构建RESTful API服务
Jul 25 Golang
go使用Gin框架利用阿里云实现短信验证码功能
Aug 04 Golang
golang语言指针操作
Apr 14 Golang
Go web入门Go pongo2模板引擎
May 20 Golang
Go gRPC进阶教程gRPC转换HTTP
Jun 16 Golang
Python测试框架pytest核心库pluggy详解
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 smarty截取中文字符乱码问题?gb2312/utf-8
2011/11/07 PHP
使用PHP实现Mysql读写分离
2013/06/28 PHP
php用户注册页面利用js进行表单验证具体实例
2013/10/17 PHP
ThinkPHP模板输出display用法分析
2014/11/26 PHP
使用PHPExcel操作Excel用法实例分析
2015/03/26 PHP
PHP使用ODBC连接数据库的方法
2015/07/18 PHP
js验证表单大全
2006/11/25 Javascript
麦鸡的TAB切换功能结合了javascript和css
2007/12/17 Javascript
js页面滚动时层智能浮动定位实现(jQuery/MooTools)
2011/08/23 Javascript
SublimeText自带格式化代码功能之reindent
2015/12/27 Javascript
JS实现iframe自适应高度的方法示例
2017/01/07 Javascript
自定义事件解决重复请求BUG的问题
2017/07/11 Javascript
JS实现身份证输入框的输入效果
2017/08/21 Javascript
JS高级技巧(简洁版)
2018/07/29 Javascript
Vue插值、表达式、分隔符、指令知识小结
2018/10/12 Javascript
浅析JavaScript异步代码优化
2019/03/18 Javascript
ES6 Promise对象的应用实例分析
2019/06/27 Javascript
vue简单封装axios插件和接口的统一管理操作示例
2020/02/02 Javascript
Vue实现跑马灯效果
2020/05/25 Javascript
JS异步宏队列与微队列原理区别详解
2020/07/02 Javascript
[01:13:51]TNC vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
利用python爬取散文网的文章实例教程
2017/06/18 Python
浅谈Python 列表字典赋值的陷阱
2019/01/20 Python
css 元素选择器的简单实例
2016/05/23 HTML / CSS
C#面试题问题集
2016/04/02 面试题
警察思想汇报
2014/01/04 职场文书
成龙洗发水广告词
2014/03/14 职场文书
环保专项行动方案
2014/05/12 职场文书
教师党员先进性教育自我剖析材料思想汇报
2014/09/24 职场文书
通知范文怎么写
2015/04/16 职场文书
关于环保的广播稿
2015/12/17 职场文书
校园安全教育心得体会
2016/01/15 职场文书
MATLAB 如何求取离散点的曲率最大值
2021/04/16 Python
MySQL优化之如何写出高质量sql语句
2021/05/17 MySQL
MySQL 聚合函数排序
2021/07/16 MySQL
PostgreSQL事务回卷实战案例详析
2022/03/25 PostgreSQL