在 Golang(Go 語言)中,并發(fā)是核心特性之一,它使得編寫能夠同時執(zhí)行多個任務(wù)的程序變得簡單而高效。Go 提供了幾種不同的機(jī)制來實現(xiàn)并發(fā),但其中最核心的是 goroutine 和 channel。
Goroutine 是 Go 運(yùn)行時(runtime)中的輕量級線程。與線程相比,goroutine 的調(diào)度由 Go 運(yùn)行時管理,而不是由操作系統(tǒng)管理,這意味著 goroutine 的創(chuàng)建和銷毀成本更低,且可以更高效地并發(fā)執(zhí)行。你可以通過 go
關(guān)鍵字來啟動一個新的 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 中執(zhí)行
say("hello") // 在當(dāng)前 goroutine 中執(zhí)行
}
在這個例子中,say("world")
在一個新的 goroutine 中執(zhí)行,而 say("hello")
在 main
goroutine 中執(zhí)行。這會導(dǎo)致 “hello” 和 “world” 交替打印,因為它們幾乎是并發(fā)執(zhí)行的。
Channel 是 Go 語言中用于在 goroutine 之間進(jìn)行通信的主要方式。你可以將 channel 看作是一個傳遞值的管道,一個 goroutine 可以通過這個管道發(fā)送值給另一個 goroutine。使用 channel,你可以同步并發(fā)執(zhí)行的 goroutine,并且安全地交換數(shù)據(jù)。
package main
import (
"fmt"
)
func count(c chan<- int) {
for i := 0; i < 10; i++ {
c <- i // 發(fā)送值到 channel
}
close(c) // 關(guān)閉 channel
}
func main() {
msgs := make(chan int, 2) // 創(chuàng)建一個帶緩沖的 channel
go count(msgs) // 啟動 goroutine
for msg := range msgs { // 循環(huán)接收值直到 channel 被關(guān)閉
fmt.Println(msg)
}
}
在這個例子中,count
函數(shù)通過 msgs
channel 發(fā)送整數(shù)值給 main
函數(shù)。main
函數(shù)通過一個 for-range 循環(huán)接收這些值,直到 channel 被關(guān)閉。
值得注意的是,并發(fā)(concurrency)和并行(parallelism)是不同的概念。并發(fā)是同時處理多個任務(wù)的能力,但這些任務(wù)并不一定是同時執(zhí)行的(比如,它們可能在不同的時間點(diǎn)被操作系統(tǒng)的線程調(diào)度器切換執(zhí)行)。而并行則是同時執(zhí)行多個任務(wù)的能力,這通常要求有多個處理器核心。
在 Go 中,通過 goroutine 和 channel 實現(xiàn)的并發(fā)可以讓你的程序更有效地利用多核處理器,因為 goroutine 可以在多個操作系統(tǒng)線程之間自動切換,而 channel 允許這些 goroutine 高效、安全地通信。
上一篇: Golang 錯誤處理
下一篇: Golang 語言開發(fā)工具