【Golang】Go的并发和并行性解释。谁说Go不是并行语言?

偶然发现百度上有很多"师出同门"的"go是并发语言,而不是并行语言"的说法。让我顿感奇怪,"并行"说白了就是对CPU多核的利用,这年头不能利用多核的编译语言还有的混?而且还混的这么好?并且go是出了名的高并发能力强,GPM模型也是为了实现并行,怎么可能会不是并行语言呢。于是进行了一番调查。。。

最终我认为起点大概率是在"Rob Pike"(Go作者之一)于2012年发表的一场演讲,名为"并发不是并行"。之后则被某些标题党曲解为"go是并发语言,而不是并行语言",百度上可以搜到很多这个说法(CV大法,师出同门),不过在Google上通过英文搜索则很少有这个说法。

像这种"以讹传讹"的现象以前也碰到过很多次了,其实深入推敲一下就比较容易发现矛盾点。在这里希望大家在传递知识的时候保持疑问心和严谨性,避免让错误的内容得到传播。当然,假如我的调查有误,这场演讲也是提供对golang并发和并行性讨论的权威指南,具有很强的参考价值。

go.dev/talks上保存了此次演讲的幻灯片(通过左右箭头键进行导航),我们可以查看它以获得此次演讲的内容。

简单说,Rob Pike 用很多"地鼠工人"(gopher)把一个"烧书"任务进行了循序渐进的并发设计,不同的并发设计支持不同的并行方式并发是一种通过将程序分成可以独立执行的片段来构建程序的方法,并发设计就是分解处理过程。例如:

  • 这是一个三只地鼠协同工作的设计,每个地鼠都是一个独立执行的一段程序。
    在这里插入图片描述

  • 这是更复杂的设计,设计了两条工作线,每条线上还加入了暂存堆,16只地鼠在努力工作。
    在这里插入图片描述

实际上地鼠就是CPU,更准确地说是goroutine,goroutine会根据需要复用到操作系统线程上(GPM模型),以实现并行。
即便一次(同一时间)只有一只地鼠在工作,整个程序仍然是并发的(这是设计结构上的),只不过不是并行的。并发而不并行就是说在单核CPU中,程序会自动地让每个地鼠交替工作,以"同时处理"多个子任务从而完成整个任务;但一旦并行(多核CPU),多个地鼠(多个CPU核心)就会"同时工作",更快地完成整个任务。

最终,幻灯片给出了并发和并行的关系结论

  • 并发性很强大。
  • 并发不是并行。
  • 并发实现了并行。
  • 并发使并行性变得容易。

从这里可以看出,Rob Pike 表达的主要思想是:并发不是并行,但并发设计对于实现并行来说是重要/必要的,并行离不开并发

在go中,goroutine就是用来进行并发设计,然后goroutine会根据情况自动的复用到操作系统线程(GPM模型),以实现并行
(ps: channel则是用来协调goroutine执行的手段)

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

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

相关文章

01-spring源码概述

文章目录 1. Spring两大主要功能2. Bean的生命周期(部分生命周期,不包括销毁)2.1 两个重要接口及Aware接口2.2 创建对象的过程2.3 Bean的scope作用域2.4 Bean的类型2.5 获得反射对象的三种方式 3. 涉及的接口汇总4. 涉及设计模式 1. Spring两…

让视频更加完美——Adobe Premiere Pro 2024 (Pr2024)正式发布!

如果您是一名视频制作人员,或者是想把自己的视频制作得更加完美的业余爱好者,那么您一定听说过Adobe Premiere Pro。Adobe Premiere Pro是一款功能强大、稳定可靠的视频编辑软件,被广泛应用于电影、电视、广告等行业。 现在,好消…

【LeetCode刷题(数据结构与算法)】:上下翻转二叉树

给你一个二叉树的根节点 root ,请你将此二叉树上下翻转,并返回新的根节点 你可以按下面的步骤翻转一棵二叉树: 原来的左子节点变成新的根节点 原来的根节点变成新的右子节点 原来的右子节点变成新的左子节点 上面的步骤逐层进行。题目数据保…

水球展示——微信小程序

html <view class"water"><view class"text">完成率{{list.finish}}%</view><view class"img" style"height: {{list.finish}}%"><image src"../../image/water.jpg" mode"" />&l…

04-React脚手架

04-React脚手架 1. react脚手架入门 1).脚手架的介绍 xxx脚手架: 用来帮助程序员快速创建一个基于xxx库的模板项目 包含了所有需要的配置&#xff08;语法检查、jsx编译、devServer…&#xff09;下载好了所有相关的依赖可以直接运行一个简单效果 react提供了一个用于创建rea…

PAM从入门到精通(一)

本文参考以下博文&#xff1a; PAM模块详解及sudo命令 PAM 的应用开发和内部实现源码分析 PAM详解&#xff08;一&#xff09;PAM介绍 百度百科 —— PAM Oracle Solaris 10 开发者安全性指南 —— PAM 框架介绍 特此致谢&#xff01; 零、引言 身份认证是操作系统安全的…

gitee page中HTML显示乱码

参考的&#xff1a;静态HTML网页部署到gitee后中文乱码-CSDN博客 根据上述引用的博客做完后要记得在gitee page中更新(我就是没点更新以为用不了)

Java GC 算法

一、概述 理解Java虚拟机垃圾回收机制的底层原理&#xff0c;是成为一个高级Java开发者的基本功。本文从底层的垃圾回收算法开始&#xff0c;着重去阐释不同垃圾回收器在算法设计和实现时的一些技术细节&#xff0c;去探索「why」这一部分&#xff0c;通过对比不同的垃圾回收算…

LabVIEW在安装了其它的NI软件之后崩溃了

LabVIEW在安装了其它的NI软件之后崩溃了 在安装了其它的NI软件之后&#xff0c;一些原本安装好的或者新安装的软件由于缺少必要的DLL而崩溃掉了。例如&#xff0c;在这种情况下&#xff0c;Teststand可能会报下面的错误&#xff1a; RetrievingCOM class factory for compone…

1.1 Windows驱动开发:配置驱动开发环境

在进行驱动开发之前&#xff0c;您需要先安装适当的开发环境和工具。首先&#xff0c;您需要安装Windows驱动开发工具包&#xff08;WDK&#xff09;&#xff0c;这是一组驱动开发所需的工具、库、示例和文档。然后&#xff0c;您需要安装Visual Studio开发环境&#xff0c;以便…

实践笔记-docker安装及配置镜像源

docker安装及配置镜像源 1.卸载旧版本docker2. 安装yum工具3. 设置镜像仓库4.安装docker5. 启动docker服务6.docker镜像源配置 当前环境linux为centos7 1.卸载旧版本docker 如果以前安装过旧版本可以先执行卸载&#xff0c;下面的截图是没有安装过。 yum remove docker \ do…

机器学习笔记 - 使用3D卷积神经网络进行视频分类

1、导入相应的库 3D CNN 使用三维滤波器来执行卷积。内核能够在三个方向上滑动,而在 2D CNN 中它可以在二维上滑动。 首先安装并导入必要的库,用于处理ZIP文件内容的Remotezip 、用于使用进度条的tqdm 、用于处理视频文件的OpenCV 、用于执行更复杂的张量操作的einop…

Python批量测试IP端口GUI程序(Tkinter)

一、实现样式 批量IP与端口中间用“,”分割&#xff0c;点击Telnet进行测试&#xff0c;前提是你电脑安装了telnet客户端&#xff0c;Clear按钮用来清空文本框。 二、核心点 1、使用Tkinter来制作桌面GUI页面 2、使用telnetlib模块测试telnet端口 三、困难点 1、测试结果…

“氛围感 真环绕”可拆卸自由观影新物种 ——索尼发布“积木音响”HT-AX7

2023年10月16日&#xff0c;索尼(中国)有限公司发布新款蓝牙音响——“积木音响”HT-AX7。该音响采用索尼360SSM技术(360空间声场映射技术&#xff0c;简称360SSM)和独特的可拆卸结构设计&#xff0c;在实现传统音响的功能基础上&#xff0c;进一步为用户提供了创新式可移动多场…

智慧饭堂报餐系统源码 智慧食堂源码

智慧饭堂报餐系统源码 智慧食堂源码 技术栈 1、前端技术栈&#xff1a;ES6、vue、vuex、vue-router、vue-cli、axios、element-ui 2、后端技术栈&#xff1a;SpringBoot、MyBatis、Spring Security、Jwt 介绍 一款java开发的智慧饭堂报餐系统&#xff0c;支持连接人脸识别…

爬虫 | 正则、Xpath、BeautifulSoup示例学习

文章目录 &#x1f4da;import requests&#x1f4da;import re&#x1f4da;from lxml import etree&#x1f4da;from bs4 import BeautifulSoup&#x1f4da;小结 契机是课程项目需要爬取一份数据&#xff0c;于是在CSDN搜了搜相关的教程。在博主【朦胧的雨梦】主页学到很多…

企业订货系统常见问题与解决方案|网站定制搭建|小程序APP开发

企业订货系统常见问题与解决方案|网站定制搭建|小程序APP开发 在企业经营中&#xff0c;订货系统是一个非常重要的工具&#xff0c;它可以帮助企业快速地获取客户需求&#xff0c;制定生产计划&#xff0c;提高供应链效率&#xff0c;帮助企业快速、准确地计算出所需物资的数量…

基于R和gephi做宏基因组与代谢组等多组学联合network相关性网络图

写在前面 拿到多组学的数据后一直在找合适的方法将二者进行关联&#xff0c;比如我这里是三种体液的代谢组与一种体液的宏基因组。需求是对多组学进行关联分析&#xff0c;直到最近看到不少文章里利用Gephi将相关性表格进行可视化的图&#xff0c;效果还不错&#xff0c;于是写…

Vue3集成高德地图:快速上手,实现你的业务需求

Vue3集成高德地图 前言一、准备工作1.开发文档2.添加应用 二、使用步骤命令安装2.地图容器创建3.组件引入4.js api 安全密钥5.初始化地图6. 图层6.1 添加 / 设置 / 获取 / 移除图层6.1.1 添加图层6.1.2 设置图层6.1.3 获取图层6.1.4 移除图层 7. 点标记8. 信息窗体8.1 默认信息…

【微服务】微服务初步认识 - 微服务技术如何学习 · 认识微服务架构

微服务&#xff08;1&#xff09; 文章目录 【微服务】&#xff08;1&#xff09;1. 微服务相关技术栈2. 微服务学习路线3. 认识微服务架构3.1 单体架构3.2 分布式架构3.3 微服务(架构)3.4 微服务(架构)治理落实相关的SpringCloud、SpringCloudAlibaba和阿里巴巴的Dubbo提供的服…