在go裡面,每一個併發執行的活動成為goroutine。
詳解:goroutine可以認為是輕量級的執行緒,與建立執行緒相比,建立成本和開銷都很小,每個goroutine的堆疊只有幾kb,並且堆疊可根據程式的需要增長和縮小(執行緒的堆疊需指明和固定),所以go程式從語言層面支援了高併發。
程式執行的背後:當一個程式啟動的時候,只有一個goroutine來呼叫main函式,稱它為主goroutine,新的goroutine通過go語句進行建立。
在函式或者方法前面加上關鍵字go,即建立一個併發執行的新goroutine。
示例如下:
package main
import (
"fmt"
"time"
)
func HelloWorld() {
fmt.Println("Hello world goroutine")
}
func main() {
go HelloWorld() // 開啟一個新的併發執行
time.Sleep(1*time.Second)
fmt.Println("我後面才輸出來")
}
執行結果:
Hello world goroutine
我後面才輸出來
示例:
package main
import (
"fmt"
"time"
)
func main() {
go DelayPrint()
go helloworld()
time.Sleep(10*time.Second)
fmt.Println("aaa")
}
func helloworld(){
fmt.Println("hello goroutine")
}
func DelayPrint(){
for i := 1; i <= 4; i++ {
time.Sleep(5*time.Second)
fmt.Println(i)
}
}
輸出結果:
hello goroutine
1
aaa
結論:
1.當main函式返回時,所有的gourutine都是暴力終結的,然後程式退出
2.當程式執行go FUNC()的時候,只是簡單的呼叫然後就立即返回了,並不關心函式裡頭髮生的故事情節,所以不同的goroutine直接不影響,main會繼續按順序執行語句
本作品採用《CC 協議》,轉載必須註明作者和本文連結