goroutine

cjc發表於2021-04-28

在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 協議》,轉載必須註明作者和本文連結

相關文章