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

2023-10-16 06:44

本文主要是介绍【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执行的手段)

这篇关于【Golang】Go的并发和并行性解释。谁说Go不是并行语言?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/219748

相关文章

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

Python中isinstance()函数原理解释及详细用法示例

《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc

Java JUC并发集合详解之线程安全容器完全攻略

《JavaJUC并发集合详解之线程安全容器完全攻略》Java通过java.util.concurrent(JUC)包提供了一整套线程安全的并发容器,它们不仅是简单的同步包装,更是基于精妙并发算法构建... 目录一、为什么需要JUC并发集合?二、核心并发集合分类与详解三、选型指南:如何选择合适的并发容器?在多

Java 结构化并发Structured Concurrency实践举例

《Java结构化并发StructuredConcurrency实践举例》Java21结构化并发通过作用域和任务句柄统一管理并发生命周期,解决线程泄漏与任务追踪问题,提升代码安全性和可观测性,其核心... 目录一、结构化并发的核心概念与设计目标二、结构化并发的核心组件(一)作用域(Scopes)(二)任务句柄

java时区时间转为UTC的代码示例和详细解释

《java时区时间转为UTC的代码示例和详细解释》作为一名经验丰富的开发者,我经常被问到如何将Java中的时间转换为UTC时间,:本文主要介绍java时区时间转为UTC的代码示例和详细解释,文中通... 目录前言步骤一:导入必要的Java包步骤二:获取指定时区的时间步骤三:将指定时区的时间转换为UTC时间步

python语言中的常用容器(集合)示例详解

《python语言中的常用容器(集合)示例详解》Python集合是一种无序且不重复的数据容器,它可以存储任意类型的对象,包括数字、字符串、元组等,下面:本文主要介绍python语言中常用容器(集合... 目录1.核心内置容器1. 列表2. 元组3. 集合4. 冻结集合5. 字典2.collections模块

使用Go调用第三方API的方法详解

《使用Go调用第三方API的方法详解》在现代应用开发中,调用第三方API是非常常见的场景,比如获取天气预报、翻译文本、发送短信等,Go作为一门高效并发的编程语言,拥有强大的标准库和丰富的第三方库,可以... 目录引言一、准备工作二、案例1:调用天气查询 API1. 注册并获取 API Key2. 代码实现3

基于Go语言开发一个 IP 归属地查询接口工具

《基于Go语言开发一个IP归属地查询接口工具》在日常开发中,IP地址归属地查询是一个常见需求,本文将带大家使用Go语言快速开发一个IP归属地查询接口服务,有需要的小伙伴可以了解下... 目录功能目标技术栈项目结构核心代码(main.go)使用方法扩展功能总结在日常开发中,IP 地址归属地查询是一个常见需求:

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2