深入理解GoLang并发与并行

 更新时间:2026年03月26日 08:29:07   作者:ruxingli  
本文主要介绍了GoLang并发与并行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Go 里的并发(Concurrency)并行(Parallelism),是面试高频、也是理解 goroutine 的核心。给你一套能讲清 + 能拿分的版本👇

🎯 一句话核心区别

并发是“同时处理多个任务的能力”,并行是“同时执行多个任务的能力”。

🧠 一、并发(Concurrency)

👉 重点:任务可以交替执行

即使只有 1 个 CPU 核心,也能并发。

示例

go task1() 
go task2() 

在单核情况下:

  • 执行 task1 一会
  • 切到 task2
  • 再切回来

➡️ 本质:调度切换

特点

  • 不一定同时执行
  • 是一种“程序结构设计”
  • Go 用 goroutine + channel 实现

🚀 二、并行(Parallelism)

👉 重点:多个任务真正同时执行

必须依赖:

  • 多核 CPU
  • Go 调度器(GMP)

示例

2 核 CPU:

  • task1 在 核1 跑
  • task2 在 核2 跑

➡️ 真正同时执行

特点

  • 一定同时执行
  • 用于提升计算速度
  • 属于“硬件 + 调度能力”

⚙️ 三、Go 是怎么实现的?

Go 的核心设计:

用 goroutine 实现并发,用 GMP 调度实现并行

🔑 关键点

1️⃣ goroutine = 并发单位

不是线程,也不等于并行

2️⃣ 是否并行取决于:

runtime.GOMAXPROCS(n) 

👉 默认:
= CPU 核心数

3️⃣ GMP 模型作用

  • G(goroutine)
  • P(调度器)
  • M(线程)

👉 调度流程:G → P → M → CPU 执行

🍳 四、一个非常好用的类比(面试加分)

并发(一个人做多件事)

一个厨师:

  • 一会炒菜
  • 一会切菜
  • 一会煮面

➡️ 来回切换

并行(多个人同时做)

多个厨师:

  • 一个炒菜
  • 一个煮面
  • 一个切菜

➡️ 同时进行

🔥 五、Go 代码对比(面试常用)

并发(未必并行)

for i := 0; i < 2; i++ {
    go func(i int) {
        fmt.Println(i)
    }(i)
}
time.Sleep(time.Second)

👉 有多个 goroutine,但不保证同时执行

并行(利用多核)

runtime.GOMAXPROCS(4) 

👉 允许 4 个线程同时运行

⚠️ 六、常见误区(一定要会)

❌ goroutine = 并行

👉 错,只是并发

❌ 并发一定更快

👉 不一定:

  • 有上下文切换开销
  • 有锁竞争

❌ 开越多 goroutine 越好

👉 错:

  • CPU 密集 → 会更慢
  • 调度压力大

🧩 七、终极总结(面试王炸)

👉 直接这样说:

在 Go 中,并发是通过 goroutine 实现的任务组织方式,而并行是通过 GMP 调度器在多核 CPU 上同时执行多个 goroutine。goroutine 本身不保证并行,是否并行取决于运行环境和调度器配置。

到此这篇关于深入理解GoLang并发与并行的文章就介绍到这了,更多相关GoLang并发与并行内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • Go语言使用net/http实现简单登录验证和文件上传功能

    Go语言使用net/http实现简单登录验证和文件上传功能

    这篇文章主要介绍了Go语言使用net/http实现简单登录验证和文件上传功能,使用net/http模块编写了一个简单的登录验证和文件上传的功能,在此做个简单记录,需要的朋友可以参考下
    2023-07-07
  • go依赖注入管理工具wire的使用方法

    go依赖注入管理工具wire的使用方法

    本文主要介绍了如何使用go wire管理依赖,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-09-09
  • 使用Golang轻松实现JWT身份验证的示例代码

    使用Golang轻松实现JWT身份验证的示例代码

    JSON Web Tokens (JWT)是一种流行的安全方法,用于在两个方之间表示声明,本文主要为大家详细介绍了实现Go应用程序中的JWT身份验证过程,需要的可以参考下
    2024-02-02
  • Golang中的调度器GPM模型详解

    Golang中的调度器GPM模型详解

    这篇文章主要介绍了Golang中的调度器GPM模型,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • 使用Go和Tesseract实现验证码识别的流程步骤

    使用Go和Tesseract实现验证码识别的流程步骤

    验证码主要用于区分人类用户和机器程序,Tesseract 是一个开源的光学字符识别(OCR)引擎,支持多种语言和字体,并具有较高的识别准确率,它由 Google 维护,并且可以通过多种编程语言调用,本文给大家介绍了使用Go和Tesseract实现验证码识别的流程步骤
    2025-01-01
  • golang内存逃逸的学习笔记

    golang内存逃逸的学习笔记

    内存逃逸是 Go 语言编程中一个特别需要注意的问题,会影响到程序的性能和稳定性,本文主要介绍了golang内存逃逸的学习笔记,感兴趣的可以了解一下
    2024-05-05
  • GO语言框架快速集成日志模块的操作方法

    GO语言框架快速集成日志模块的操作方法

    zap是一个可以在go项目中进行快速, 结构化且分级的日志记录包, git star数高达16.3k, Git 项目地址, 在各大公司项目中被广泛使用,这篇文章主要介绍了GO语言框架中如何快速集成日志模块,需要的朋友可以参考下
    2022-07-07
  • 详解Go语言如何利用上下文进行并发计算

    详解Go语言如何利用上下文进行并发计算

    在Go编程中,上下文(context)是一个非常重要的概念,它包含了与请求相关的信息,本文主要来和大家讨论一下如何在并发计算中使用上下文,感兴趣的可以了解下
    2024-02-02
  • 用go gin server来做文件上传服务

    用go gin server来做文件上传服务

    今天小编就为大家分享一篇关于用go gin server来做文件上传服务,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • go proto编译引用外部包问题解决方案示例

    go proto编译引用外部包问题解决方案示例

    这篇文章主要为大家介绍了go proto编译引用外部包问题解决方案示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10

最新评论