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如何替换某个文件中的字符串
Apr 25 Golang
解决golang post文件时Content-Type出现的问题
May 02 Golang
goland设置颜色和字体的操作
May 05 Golang
Golang 实现获取当前函数名称和文件行号等操作
May 08 Golang
Go语言基础知识点介绍
Jul 04 Golang
Go Plugins插件的实现方式
Aug 07 Golang
浅谈GO中的Channel以及死锁的造成
Mar 18 Golang
简单聊聊Golang中defer预计算参数
Mar 25 Golang
golang操作rocketmq的示例代码
Apr 06 Golang
Go获取两个时区的时间差
Apr 20 Golang
Golang map映射的用法
Apr 22 Golang
Golang 实现 WebSockets 之创建 WebSockets
Apr 24 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 array_intersect比array_diff快(附详细的使用说明)
2011/07/03 PHP
php中socket的用法详解
2014/10/24 PHP
PHP会话控制实例分析
2016/12/24 PHP
PHP实现websocket通信的方法示例
2018/08/28 PHP
javascript之典型高阶函数应用介绍
2013/01/10 Javascript
为什么要在引入的css或者js文件后面加参数的详细讲解
2013/05/03 Javascript
使用jQuery mobile库检测url绝对地址和相对地址的方法
2015/12/04 Javascript
Backbone中View之间传值的学习心得
2016/08/09 Javascript
jQuery EasyUI 获取tabs的实例解析
2016/12/06 Javascript
BootStrap表单验证实例代码
2017/01/13 Javascript
js通过keyCode值判断单击键盘上某个键,然后触发指定的事件方法
2017/02/19 Javascript
Vue.js实现在下拉列表区域外点击即可关闭下拉列表的功能(自定义下拉列表)
2017/05/30 Javascript
react开发教程之React 组件之间的通信方式
2017/08/12 Javascript
zTree jQuery 树插件的使用(实例讲解)
2017/09/25 jQuery
nodejs使用http模块发送get与post请求的方法示例
2018/01/08 NodeJs
Vue引入jquery实现平滑滚动到指定位置
2018/05/09 jQuery
详解Vue底部导航栏组件
2019/05/02 Javascript
Node.js 的 GC 机制详解
2019/06/03 Javascript
微信小程序实现页面左右滑动
2020/11/16 Javascript
vue使用exif获取图片经纬度的示例代码
2020/12/11 Vue.js
[01:00:14]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第三场
2018/04/10 DOTA
python读取csv文件示例(python操作csv)
2014/03/11 Python
Python去除列表中重复元素的方法
2015/03/20 Python
python实现域名系统(DNS)正向查询的方法
2016/04/19 Python
微信跳一跳python代码实现
2018/01/05 Python
Python学习_几种存取xls/xlsx文件的方法总结
2018/05/03 Python
Python函数参数匹配模型通用规则keyword-only参数详解
2019/06/10 Python
在Java开发中如何选择使用哪种集合类
2016/08/09 面试题
写自荐信有哪些不宜?
2013/10/17 职场文书
个人求职信范文分享
2013/12/13 职场文书
小区门卫岗位职责
2013/12/31 职场文书
银行职员思想汇报
2013/12/31 职场文书
二年级语文教学反思
2014/02/02 职场文书
2016七一建党节慰问信
2015/11/30 职场文书
创业计划书之健康营养产业
2019/10/15 职场文书
Go语言-为什么返回值为接口类型,却返回结构体
2021/04/24 Golang