Go并发编程:Goroutines、Channels与Pipelines
1. Go调度器与并发并行概念
在Go编程中,Unix内核调度器负责程序线程的执行,而Go运行时拥有自己的调度器。Go调度器采用m:n调度技术,通过多路复用的方式,使用n个操作系统线程来执行m个goroutine。它决定了Go程序中goroutine的执行方式和顺序,由于只处理单个程序的goroutine,其操作比内核调度器更简单、成本更低且速度更快。
很多人会混淆并发和并行的概念,实际上它们并不相同。并行是指多个实体的同时执行,而并发是一种组件结构方式,使组件在可能的情况下能独立执行。只有在并发构建软件组件时,在操作系统和硬件允许的情况下,才能安全地并行执行这些组件。在有效的并发设计中,增加并发实体可以使整个系统运行得更快,因为更多的任务可以并行执行。所以,开发者在系统设计阶段应考虑并发,将问题分解为独立的组件,而不是直接考虑并行。即使在Unix机器上无法并行运行函数,有效的并发设计也能提高程序的设计和可维护性,从这个角度来说,并发优于并行。
2. Goroutines
在Go中,可以使用 go 关键字来定义一个新的goroutine,它可以跟函数名或匿名函数的完整定义。 go 关键字会使函数调用立即返回,函数作为goroutine在后台运行,程序的其余部分继续执行。不过,由于goroutine的执行顺序取决于操作系统调度器、Go调度器和操作系统负载,所以无法控制或假设其执行顺序。
2.1 创建单个goroutine
有两种创建goroutine的方法:使用普通函数和匿名函数,这
超级会员免费看
订阅专栏 解锁全文
11

被折叠的 条评论
为什么被折叠?



