正確理解Go高級并發(fā)模式
"并發(fā)不是并行,但使并行成為可能。" —— Rob Pike
本文將深入探討Go中的一些高級并發(fā)模式。Go以其內(nèi)置的并發(fā)原語而聞名,理解這些模式可以幫助我們編寫更高效、可擴展的應用程序。
1. 基礎Goroutine
goroutine是由Go運行時管理的輕量級線程。要啟動一個goroutine,只需在函數(shù)前使用go關鍵字。
package main
import (
"fmt"
"time"
)
func sayHello() {
fmt.Println("Hello from a goroutine!")
}
func main() {
go sayHello() // This starts a new goroutine.
time.Sleep(1 * time.Second) // Give goroutine some time to execute.
}
在本例中,sayHello函數(shù)與main函數(shù)并發(fā)運行。
2. Channel和Select
channel用于在程序之間進行通信,同步執(zhí)行并確保數(shù)據(jù)安全。
(1) 基礎channel示例
package main
import "fmt"
func main() {
message := make(chan string) // create a new channel
go func() { // start a goroutine
message <- "Hello from the other side!" // send a message to the channel
}()
msg := <-message // receive a message from the channel
fmt.Println(msg)
}
我們可以通過channel安全的在例程之間發(fā)送和接收消息。
(2) 使用Select
select允許程序等待多個通信操作,它就像一個針對channel的switch語句。
package main
import (
"fmt"
"time"
)
func main() {
ch1 := make(chan string)
ch2 := make(chan string)
go func() {
for {
ch1 <- "from ch1"
time.Sleep(2 * time.Second)
}
}()
go func() {
for {
ch2 <- "from ch2"
time.Sleep(3 * time.Second)
}
}()
go func() {
for {
select {
case msg1 := <-ch1:
fmt.Println(msg1)
case msg2 := <-ch2:
fmt.Println(msg2)
}
}
}()
select {} // keep the main function alive
}
基于select,我們可以同時處理多個channel。
3. 高級模式: 工作池(Worker Pool)
工作池是一種限制運行的goroutine數(shù)量的方法。
工作池示例:
package main
import (
"fmt"
"time"
)
func worker(id int, jobs <-chan int, results chan<- int) {
for j := range jobs {
fmt.Println("worker", id, "processing job", j)
time.Sleep(time.Second)
results <- j * 2
}
}
func main() {
const numJobs = 5
jobs := make(chan int, numJobs)
results := make(chan int, numJobs)
// start 3 workers
for w := 1; w <= 3; w++ {
go worker(w, jobs, results)
}
// send jobs
for j := 1; j <= numJobs; j++ {
jobs <- j
}
close(jobs)
// collect results
for a := 1; a <= numJobs; a++ {
<-results
}
}
工作池幫助我們管理和限制并發(fā)運行的goroutine數(shù)量。
結(jié)論
Go中的并發(fā)(goroutine、channel和模式)為開發(fā)人員提供了強大的工具集。通過理解和利用這些概念,可以構建高性能和可伸縮的應用程序。