golang中的并发和并行
作者:盼盼编程 发布时间:2024-04-26 17:15:11
标签:golang,并发,并行
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)
}
以上为个人经验,希望能给大家一个参考,也希望大家多多支持asp之家。如有错误或未考虑完全的地方,望不吝赐教。
来源:https://blog.csdn.net/ma2595162349/article/details/109190950


猜你喜欢
- 字典的键 字典中的值没有任何限制, 可以是任意Python对象,即从
- 如果是在Oracle10g之前,删除一个表空间中的数据文件后,其文件在数据库数据字典中会仍然存在,除非你删除表空间,否则文件信息不会清除。但
- 在网站的一些应用中需要提供用户直接打印页面的功能,最明显的就是电子优惠券,商家根据网站提供的模板输入内容,然后生成优惠券页面,用户打印这个页
- 本文实例讲述了php计算函数执行时间的方法。分享给大家供大家参考。具体如下:我们可以通过在程序的前后分别记录开始和结束时间,两个时间差就是程
- 今天我们来介绍下Python基础教程学习之iter() 方法另外的用法。据说很少有人知道这个用法!一、上代码、学用法我们都比较熟悉 iter
- 安装pyinstallerpip install pyinstaller制作项目的.spec文件 进入django项目所在路径,
- 启用 SQL Server Browser 服务 在 Windows 防火墙中创建例外 在 Windows 防火墙中为 SQL Server
- 本文实例讲述了python实现希尔排序算法的方法。分享给大家供大家参考。具体如下:def shellSort(items): i
- 一、前言在Python中,类表示具有相同属性和方法的对象的集合。在使用类时,需要先定义类,然后再创建类的实例,通过类的实例就可以访问类中的属
- 对着谷歌大神膜拜了一下午, 终于让我找到了一款免费的,国产货!!外观虽然不能跟老外的比,但是功能还挺全,实用就好。下载地址:http://x
- 对于数据库管理员来说,可以经常想了解一些之前未听说过的存储过程,特别是无文档类型的存储过程。或许是用这些存储过程,能够简化日常的数据管理。为
- 我的世界小游戏使用方法:移动前进:W,后退:S,向左:A,向右:D,环顾四周:鼠标,跳起:空格键,切换飞行模式:Tab;选择建筑材料砖:1,
- 以下方案皆为引用,仅供参考。方案一:1.先声明一下,这种解决方法适用于任何版本的永久破解启动不了的情况(包括:2019版本的)2.下面直接切
- 前言大家都知道Python的优点是开发效率高,使用方便,C++则是运行效率高,这两者可以相辅相成,不管是在Python项目中嵌入C++代码,
- 前言:group by函数后取到的是分组中的第一条数据,但是我们有时候需要取出各分组的最新一条,该怎么实现呢?本文提供两种实现方式。一、准备
- 【问题描述】我们生产环境有一组集群的多台MySQL服务器(MySQL 5.6.21),不定期的会crash,但error log中只记录了重
- var obj = document.getElementById("testSelect"); //定位idvar i
- vuex状态刷新网页时数据被清空问题vuex状态管理,在网页刷新数据被清空的解决方法。在main.js中写入下面的代码段(亲测有效)//刷新
- 目前绝大多数手机都支持WAP 2.0。WAP 2.0的页面设计具有更好的视觉效果,更接近网页。不过由于手机千差万别,手机浏览器的能力也各不相
- 本文实例讲述了python实现string和dict的相互转换方法。分享给大家供大家参考,具体如下:字典(dict)转为字符串(string