Go 語言中的 Goroutine 是一種輕量級的并發執行單位。它可以與其他 Goroutine 并發地執行,而不需要顯式地管理線程的創建和銷毀。Goroutine 是 Go 語言并發模型的核心組成部分,它使得編寫并發程序變得更加簡單和高效。
例一
- 創建兩個function,一個打印數字,另一個打印字母,分別通過routine并行運行
- 源碼和運行結果如下:
admin@hpc-1:~/go/my_routine$ cat main.go
package mainimport ("fmt""time"
)func printNumbers() {for i := 1; i <= 5; i++ {fmt.Println(i)time.Sleep(1 * time.Second)}
}func printLetters() {for i := 'a'; i <= 'e'; i++ {fmt.Printf("%c\n", i)time.Sleep(1 * time.Second)}
}func main() {go printNumbers() // 啟動一個 Goroutine 執行 printNumbers 函數go printLetters() // 啟動一個 Goroutine 執行 printLetters 函數// 主 Goroutine 繼續執行其他操作time.Sleep(6 * time.Second) // 等待足夠的時間以確保 Goroutine 執行完畢fmt.Println("Main Goroutine exits")
}
admin@hpc-1:~/go/my_routine$
admin@hpc-1:~/go/my_routine$ go run main.go
a
1
2
b
3
c
d
4
e
5
Main Goroutine exits
admin@hpc-1:~/go/my_routine$
- 說明
- 使用關鍵字
go
加函數調用來創建一個Goroutine - 兩個Goroutine啟動后,分別同時獨立執行,可以看到打印的字符并非一對一個
- 這里采用主程序簡單等待6秒,期望6秒內兩個Goroutine都能運行結束,然后運行主程序的print
- 使用關鍵字
例二
- 在 Go 語言中,可以使用 sync.WaitGroup 來等待 Goroutine 的完成,然后再繼續主程序的執行
- 下面是用WG改進后的源碼和執行結果,特意讓printLetters多打印一些字符
admin@hpc-1:~/go/my_routine$ cat main.go
package mainimport ("fmt""sync""time"
)func printNumbers(wg *sync.WaitGroup) {defer wg.Done()for i := 1; i <= 5; i++ {fmt.Println(i)time.Sleep(1 * time.Second)}fmt.Println("Goroutine 1 finished")
}func printLetters(wg *sync.WaitGroup) {defer wg.Done()for i := 'a'; i <= 'k'; i++ {fmt.Printf("%c\n", i)time.Sleep(1 * time.Second)}fmt.Println("Goroutine 2 finished")
}func main() {var wg sync.WaitGroupwg.Add(2) // 設置 WaitGroup 的計數器為 2,表示有兩個 Goroutinego printNumbers(&wg)go printLetters(&wg)fmt.Println("Main program continues to run")wg.Wait()fmt.Println("All Goroutines have exited")
}
admin@hpc-1:~/go/my_routine$
admin@hpc-1:~/go/my_routine$
admin@hpc-1:~/go/my_routine$ go run main.go
Main program continues to run
a
1
b
2
3
c
4
d
5
e
Goroutine 1 finished
f
g
h
i
j
k
Goroutine 2 finished
All Goroutines have exited
admin@hpc-1:~/go/my_routine$
- 說明
- 用
go
啟動Goroutine的時候,傳遞的是wg的指針
,而不是值
,否則Goroutine操作的就是wg的不同副本
了 - printNumbers執行完畢退出,但是printLetters并未執行完,主程序會繼續等待
- 用