Golang 设置运行的cpu数与channel管道

介绍:为了充分了利用多cpu的优势,在Golang程序中,设置运行的cpu数目。

func main() {//获取系统当前cpu的数量num := runtime.NumCPU()//这里根据需求来设置整个go程序去使用几个cpuruntime.GOMAXPROCS(num)fmt.Println("num =", num)
}

比如你有逻辑的4个cpu,但是在程序里面只想使用3个。另外一个我要保留下来给其他程序使用,因为你占满了cpu导致其他程序可能跑不起来了。

(1)go1.8后,默认让程序运行在多个核上,可以不用设置了
(2)go1.8前,还是要设置一下,可以更高效的利益cpu
 

channel(管道)-看个需求


需求:现在要计算1-200的各个数的阶乘,并且把各个数的阶乘放入到map中。最后显示出来。要求使用goroutine完成

分析思路:
1)使用goroutine来完成,效率高,但是会出现并发/并行安全问题.
2)这里就提出了不同goroutine如何通信的问题
代码实现
1)使用goroutine来完成(看看使用gorotine并发完成会出现什么问题?然后我们会去解决)
2)在运行某个程序时,如何知道是否存在资源竞争问题。方法很简单,在编译该程序时,增加一个参数-race即可[示意图]

package mainimport ("fmt""time"
)var (m = make(map[int]int, 10)
)// test函数就是计算n的阶乘
func test(n int) {res := 1for i := 1; i <= n; i++ {res = res * i}//将计算结果放到map当中m[n] = res
}func main() {//这里开启多协程完成任务for i := 1; i <= 100; i++ {go test(i)}time.Sleep(time.Second * 10)for k, v := range m {fmt.Println(k, v)}
}

fatal error: concurrent map writes                           

多个协程在同时操作同一块的map空间。

==================
WARNING: DATA RACE
Write at 0x00c00013e480 by goroutine 8:runtime.mapassign_fast64()D:/Go/src/runtime/map_fast64.go:93 +0x0main.test()C:/Users/W10/GolandProjects/goroutine/channel.go:19 +0x70main.main.func1()C:/Users/W10/GolandProjects/goroutine/channel.go:25 +0x39Previous write at 0x00c00013e480 by goroutine 7:main.main()C:/Users/W10/GolandProjects/goroutine/channel.go:25 +0x84Goroutine 7 (finished) created at:main.main()C:/Users/W10/GolandProjects/goroutine/channel.go:25 +0x84Found 2 data race(s)

可以看到有几个数据发生竞争关系。

现在要解决这个问题有两个办法,一个就是使用全局变量加锁搞定。当任何协程去操作这个空间时候看看是否加锁,如果加锁了其他协程就需要等待。

不同goroutine之间如何通讯
1)全局变量加锁同步
2)channel

使用全局变量加锁同步改进程序
>因为没有对全局变量m加锁,因此会出现资源争夺问题,代码会出现错误,提示concurrent map writes

>解决方案:加入互斥锁

>我们的数的阶乘很大,结果会越界,可以将求阶乘改成sum+=uint64(i)
 

package mainimport ("fmt""sync""time"
)var (m = make(map[int]int, 10)//声明一个全局的互斥锁  lock是一个全局的互斥锁//sync是包 同步的意思 mutex是互斥的意思lock sync.Mutex
)// test函数就是计算n的阶乘
func test(n int) {res := 1for i := 1; i <= n; i++ {res = res * i}//将计算结果放到map当中 加锁lock.Lock()m[n] = reslock.Unlock()
}func main() {//这里开启多协程完成任务for i := 1; i <= 20; i++ {go test(i)}time.Sleep(time.Second * 10)for k, v := range m {fmt.Println(k, v)}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/209860.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

室内外融合便携式定位终端5G+UWB+RTK

一、介绍 便携式定位终端主要用于提供高精度的位置数据&#xff0c;支持室内UWB定位和室外北斗系统定位功能&#xff0c;支持5G公网和5G专网通信功能&#xff0c;便携式定位终端中超宽带(UWB)和实时动态(RTK)技术的集成代表了精确位置跟踪方面的重大进步。这款UWBRTK便携式定位…

Windows开启SQL Server服及1433端口

需求&#xff1a;Windows开启SQL Server服务及1433端口 目前端口没有启动 解决&#xff1a; 打开SQL Server配置管理器&#xff08;winR&#xff09; 各个sqlserver版本在textbox中输入对应的命令如下&#xff1a; SQLServerManager15.msc&#xff08;对于 SQL Server 2019 &am…

python获取阿里云云解析dns的域名解析记录

最近由于工作原因接触到阿里云的服务&#xff0c;我需要实时获取所有的域名信息&#xff0c;用于对其进行扫描&#xff0c;因此写了一个自动化爬取脚本 给需要的人分享。 &#xff08;阿里云有官方的demo&#xff0c;有兴趣的可以自己看一下&#xff0c;后面也会放链接&#xf…

高级/进阶”算法和数据结构书籍推荐

“高级/进阶”算法和数据结构书籍推荐《高级算法和数据结构》 高级算法和数据结构 为什么要选择本书 谈及为什么需要花时间学算法&#xff0c;我至少可以列举出三个很好的理由。 (1)性能&#xff1a;选择正确的算法可以显著提升应用程序的速度。仅就搜索来说&#xff0c;用二…

人工智能发展史

人工智能&#xff08;AI&#xff09;的发展史是一段跨越数十年的旅程&#xff0c;涵盖了从早期理论探索到现代技术革新的广泛内容。人工智能的发展历程展示了从最初的概念探索到现代技术突破的演变。尽管经历了多次起伏&#xff0c;但AI领域持续进步&#xff0c;不断拓展其应用…

2243:Knight Moves

文章目录 题目描述思路1. DFS2. BFS3. 动态规划 解题方法1. DFS2. BFS3. 动态规划 题目描述 题目链接 翻译如下&#xff1a; 注&#xff1a;骑士移动是和象棋里的马一样走的是日字型 你的一个朋友正在研究旅行骑士问题 &#xff08;TKP&#xff09;&#xff0c;你要找到最短的…

Android 断点调试

Android 调试 https://developer.android.google.cn/studio/debug?hlzh-cn 调试自己写的代码&#xff08;不在Android源码&#xff09; 点击 Attach debugger to Android process 图标 需要在添加断点界面手动输入函数名 但也可以不手动&#xff0c;有个技巧可以new 空proje…

个人博客搭建保姆级教程-HTML页面编写篇

选择模板 首先我们要选一个好的模板&#xff0c;然后对模板进行剪裁。我的模板是在站长之家进行下载的 素材下载-分享综合设计素材免费下载的平台-站长素材 我选的模板的具体地址是 个人博客资讯网页模板 这里需要我们学习一下在前边一篇文章里提到的HTML、JavaScript、CSS…

C++ :运算符重载

运算符重载&#xff1a; 运算符重载概念&#xff1a;对已有的运算符重新进行定义&#xff0c;赋予其另一种功能&#xff0c;以适应不同的数据类型 运算符的重载实际是一种特殊的函数重载&#xff0c;必须定义一个函数&#xff0c;并告诉C编译器&#xff0c;当遇到该重载的运算符…

华为拆分零部件业务,长安入股,赛力斯接洽中

作者 |德新 编辑 |王博 11月26日&#xff0c;长安汽车官宣与华为在智能汽车零部件业务上的投资与合作&#xff1a; 华为拟成立一家新的公司&#xff0c;并将其在智能汽车解决方案业务上的核心技术和资源注入新公司&#xff0c;长安汽车及关联方有意投资该新公司。 参照目前长…

浮点数二分例题:数的三次方根-Java版

//浮点数二分,正常写就行,不用考虑死循环问题import java.util.Scanner;public class Main{public static void main(String[] args) {Scanner sc new Scanner(System.in);Double n sc.nextDouble();double l -100,r 100;//数据范围是100000,开了三次方后不会超过100//小知…

【Altium designer 20】

Altium designer 20 1. Altium designer 201.1 原理图库1.1.1 上划岗 在字母前面加\在加字母1.1.2 自定义快捷键1.1.3 对齐1.1.4 在原有的电路图中使用封装1.1.5 利用excel创建IC类元件库1.1.6 现有原理图库分类以及调用1.1.7 现有原理图库中自动生成原理图库 1.2 绘制原理图1.…

质量小议35 -- SQL注入

已经记不得上次用到SQL注入是什么时候了&#xff0c;一些概念和操作已经模糊。 最近与人聊起SQL注入&#xff0c;重新翻阅&#xff0c;暂记于此。 重点&#xff1a;敏感信息、权限过大、未脱敏的输入/输出、协议、框架、数据包、明文、安全意识 SQL - Structured Query La…

打破卫浴行业冰山!九牧重构高端服务品牌“点线面”新秩序

文 | 螳螂观察 作者 | 余一 说到服务&#xff0c;你首先会想到哪个品牌&#xff1f;海底捞大概率会是其中之一。 一个餐饮品牌&#xff0c;不靠价格、口味出圈&#xff0c;而是凭借服务走向全球市场&#xff0c;古往今来或许也是头一家了&#xff0c;而无微不至的的服务&…

设计模式-结构型模式之桥接设计模式

文章目录 三、桥接模式 三、桥接模式 桥接模式&#xff08;Bridge&#xff09;是用于把抽象化与实现化解耦&#xff0c;使得二者可以独立变化。它通过提供抽象化和实现化之间的桥接结构&#xff0c;来实现二者的解耦。 这种模式涉及到一个作为桥接的接口&#xff0c;使得实体类…

MySQL安装

目录 MySQL简介 MySQL安装 连接MySQL数据库 MySQL简介 MySQL是最流行的关系型数据库管理系统之一&#xff0c;属于Oracle旗下产品。由于其体积小、速度快、总体拥有成本低&#xff0c;尤其是开放源码这一特点&#xff0c;一般中小型和大型网站的开发都选择 MySQL作为网站数据…

JVM:双亲委派(未完结)

类加载 定义 一个java文件从编写代码到最终运行&#xff0c;必须要经历编译和类加载的过程&#xff0c;如下图&#xff08;图源自b站视频up主“跟着Mic学架构”&#xff09;。 编译就是把.java文件变成.class文件。类加载就是把.class文件加载到JVM内存中&#xff0c;得到一…

使用Docker安装部署Swagger Editor并远程访问编辑API文档

文章目录 Swagger Editor本地接口文档公网远程访问1. 部署Swagger Editor2. Linux安装Cpolar3. 配置Swagger Editor公网地址4. 远程访问Swagger Editor5. 固定Swagger Editor公网地址 Swagger Editor本地接口文档公网远程访问 Swagger Editor是一个用于编写OpenAPI规范的开源编…

UE5 - 虚幻引擎各模块流程图

来自虚幻官方的一些资料&#xff0c;分享一下&#xff1b; 一些模块的流程图&#xff0c;比如动画模块&#xff1a; 或角色相关流程&#xff1a; 由于图片比较大&#xff0c;上传到了网络&#xff0c;可自取&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1BQ2KiuP08c…

GitHub项目推荐-Deoldify

有小伙伴推荐了一个老照片上色的GitHub项目&#xff0c;看了简介&#xff0c;还不错&#xff0c;推荐给大家。 项目地址 GitHub - SpenserCai/sd-webui-deoldify: DeOldify for Stable Diffusion WebUI&#xff1a;This is an extension for StableDiffusions AUTOMATIC1111 w…