在 Golang(Go 语言)中,并发是核心特性之一,它使得编写能够同时执行多个任务的程序变得简单而高效。Go 提供了几种不同的机制来实现并发,但其中最核心的是 goroutine 和 channel。
Goroutine 是 Go 运行时(runtime)中的轻量级线程。与线程相比,goroutine 的调度由 Go 运行时管理,而不是由操作系统管理,这意味着 goroutine 的创建和销毁成本更低,且可以更高效地并发执行。你可以通过 go
关键字来启动一个新的 goroutine。
package main
import (
"fmt"
"time"
)
func say(s string) {
for i := 0; i < 5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func main() {
go say("world") // 在新的 goroutine 中执行
say("hello") // 在当前 goroutine 中执行
}
在这个例子中,say("world")
在一个新的 goroutine 中执行,而 say("hello")
在 main
goroutine 中执行。这会导致 “hello” 和 “world” 交替打印,因为它们几乎是并发执行的。
Channel 是 Go 语言中用于在 goroutine 之间进行通信的主要方式。你可以将 channel 看作是一个传递值的管道,一个 goroutine 可以通过这个管道发送值给另一个 goroutine。使用 channel,你可以同步并发执行的 goroutine,并且安全地交换数据。
package main
import (
"fmt"
)
func count(c chan<- int) {
for i := 0; i < 10; i++ {
c <- i // 发送值到 channel
}
close(c) // 关闭 channel
}
func main() {
msgs := make(chan int, 2) // 创建一个带缓冲的 channel
go count(msgs) // 启动 goroutine
for msg := range msgs { // 循环接收值直到 channel 被关闭
fmt.Println(msg)
}
}
在这个例子中,count
函数通过 msgs
channel 发送整数值给 main
函数。main
函数通过一个 for-range 循环接收这些值,直到 channel 被关闭。
值得注意的是,并发(concurrency)和并行(parallelism)是不同的概念。并发是同时处理多个任务的能力,但这些任务并不一定是同时执行的(比如,它们可能在不同的时间点被操作系统的线程调度器切换执行)。而并行则是同时执行多个任务的能力,这通常要求有多个处理器核心。
在 Go 中,通过 goroutine 和 channel 实现的并发可以让你的程序更有效地利用多核处理器,因为 goroutine 可以在多个操作系统线程之间自动切换,而 channel 允许这些 goroutine 高效、安全地通信。
上一篇: Golang 错误处理
下一篇: Golang 语言开发工具