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语言中切片与内存复制 memcpy 的实现操作
Apr 27 Golang
golang 如何用反射reflect操作结构体
Apr 28 Golang
对Golang中的FORM相关字段理解
May 02 Golang
goland设置颜色和字体的操作
May 05 Golang
使用golang编写一个并发工作队列
May 08 Golang
关于golang高并发的实现与注意事项说明
May 08 Golang
go select编译期的优化处理逻辑使用场景分析
Jun 28 Golang
golang内置函数len的小技巧
Jul 25 Golang
Golang 遍历二叉树
Apr 19 Golang
Golang map映射的用法
Apr 22 Golang
Go语言编译原理之源码调试
Aug 05 Golang
Go gorilla/sessions库安装使用
Aug 14 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中文验证码实现方法
2015/06/18 PHP
浅析php-fpm静态和动态执行方式的比较
2016/11/09 PHP
Mac系统完美安装PHP7详细教程
2017/06/06 PHP
php+ajax 文件上传代码实例
2019/03/18 PHP
PHP发送邮件确认验证注册功能示例【修改别人邮件类】
2019/11/09 PHP
PHP实现微信提现功能(微信商城)
2019/11/21 PHP
php查看一个变量的占用内存的实例代码
2020/03/29 PHP
判断脚本加载是否完成的方法
2009/05/26 Javascript
浅谈JavaScript的Polymer框架中的事件绑定
2015/07/29 Javascript
JS+CSS简单树形菜单实现方法
2015/09/12 Javascript
微信jssdk用法汇总
2016/07/16 Javascript
canvas实现图像布局填充功能
2017/02/06 Javascript
详解使用grunt完成requirejs的合并压缩和js文件的版本控制
2017/03/02 Javascript
Angular.JS通过指令操作DOM的方法
2017/05/10 Javascript
jQuery实现可兼容IE6的淡入淡出效果告警提示功能示例
2017/09/20 jQuery
vue项目刷新当前页面的三种方法
2018/12/04 Javascript
JS扁平化输出数组的2种方法解析
2019/09/17 Javascript
jQuery 隐藏/显示效果函数用法实例分析
2020/05/20 jQuery
vue开发简单上传图片功能
2020/06/30 Javascript
[01:14:30]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第二场 8.20.mp4
2019/08/22 DOTA
Python ORM框架SQLAlchemy学习笔记之关系映射实例
2014/06/10 Python
Python3中条件控制、循环与函数的简易教程
2017/11/21 Python
Python生成指定数量的优惠码实操内容
2019/06/18 Python
python线性插值解析
2020/07/05 Python
pycharm2020.1.2永久破解激活教程,实测有效
2020/10/29 Python
HTML5 canvas实现的静态循环滚动播放弹幕
2021/01/05 HTML / CSS
中国网上药店领导者:1药网
2017/02/16 全球购物
TripAdvisor斯洛伐克:阅读评论、比较价格和酒店预订
2018/04/25 全球购物
Marc O’Polo俄罗斯官方在线商店:德国高端时尚品牌
2019/12/26 全球购物
公司晚会策划方案
2014/05/17 职场文书
社区助残日活动总结
2014/08/29 职场文书
离婚协议书应该怎么写
2014/10/12 职场文书
弘扬焦裕禄精神践行三严三实心得体会
2014/10/13 职场文书
客户经理岗位职责
2015/01/31 职场文书
创业计划书之服装
2019/10/07 职场文书
导游词之重庆渣滓洞
2020/01/08 职场文书