Go 语言并发编程 第一部分:基础与同步

发布日期:2026-05-01 10:02:50   浏览量 :0
发布日期:2026-05-01 10:02:50  
0

2026西湖龙井茶官网DTC发售:茶农直供,政府溯源防伪到农户家 

“Go 语言中的并发”系列文章的第一部分,我们将探讨关于并发和同步的基础知识

并发与并行

首先,让我们来理解这两个概念

并发

  • 定义是在同一时间段内处理多个任务的能力
  • 每个任务不一定要同时发生,只要交替执行任务就算作并发
  • 主要特征是每个任务的开始时间存在重叠

并行

  • 定义是同时处理多个任务的能力
  • 必须依赖硬件支持


插图由 Gemini 生成

注意:并发可以是并行,也可以不是,这取决于硬件映射方式

即使没有并行运行,并发运行也能提高速度,因为通常在日常工作中总需要等待某些事情,例如等待从内存读取数据或将数据写入内存。在等待期间,如果我们能切换到执行其他任务,就能提高整体工作效率

Go 语言中的并发和并行

Go 是一种内置并发支持的语言,无需使用第三方库
并且通过设置 GOMAXPROCS > 1,也可以实现并行处理

代码中设置示例

runtime.GOMAXPROCS(4)

或者通过环境变量进行设置

export GOMAXPROCS=4

GOMAXPROCS 用于指定在某一时刻可以同时执行 Go 代码的操作系统线程数量

在 Go 1.5 及更高版本中,GOMAXPROCS 的默认值等于机器的逻辑中央处理器数量,这已经能最大限度地发挥硬件性能,无需修改。如果设置得过高,会导致上下文切换增加,从而降低运行速度

Goroutine(协程)

通常,其他语言的并发使用线程,而在 Go 中,我们使用称为 Goroutine 的机制,它可以被称为轻量级线程

那么它们有什么区别呢?

如前所述,并发依赖于任务切换,也称为调度。对于线程而言,负责调度的主体是操作系统

但在 Go 中,Goroutine 在线程内部运行(单个线程内可以容纳数千甚至数万个 Goroutine,且占用的内存远少于线程),并由 Go 运行时调度器 负责调度

当我们启动 main() 函数时,Go 会创建第一个称为主协程的 Goroutine 来运行。如果希望程序以并发方式工作,我们可以轻松地在另一个协程中运行所需任务,只需在调用函数前加上关键字 go 即可

让我们试一试

func main() 

免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。

关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
支持 反馈 订阅 数据
回到顶部