Go 範例:goroutine

goroutine 是個執行中的輕量級緒線。

package main
import (
    "fmt"
    "time"
)
func f(from string) {
    for i := 0; i < 3; i++ {
        fmt.Println(from, ":", i)
    }
}
func main() {

假設我們有函式呼叫 f(s)。以下是我們呼叫同程式,並同步執行的典型方式。

    f("direct")

在 goroutine 中呼叫此函式,請使用 go f(s)。此新的 goroutine 將與呼叫 goroutine 同時執行。

    go f("goroutine")

您也可以針對匿名函式呼叫啟動 goroutine。

    go func(msg string) {
        fmt.Println(msg)
    }("going")

我們的兩個函式呼叫現正分開在 goroutine 中非同步執行。等它們執行完畢(建議採用更穩健的做法,使用 WaitGroup)。

    time.Sleep(time.Second)
    fmt.Println("done")
}

執行此程式時,我們會先看到封鎖呼叫的結果,然後再看到兩個 goroutine 的結果。goroutine 的結果可能會交錯出現,因為 goroutine 是由 Go 執行階段同時執行。

$ go run goroutines.go
direct : 0
direct : 1
direct : 2
goroutine : 0
going
goroutine : 1
goroutine : 2
done

接下來我們將觀察 goroutine 在並行的 Go 程式中所扮演的補角:通道。

下一個範例:通道