Go 示例: 协程

协程 是一个轻量级的执行线程。

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")

要在协程中调用此函数,请使用 go f(s)。这个新的协程将与调用它的协程并发执行。

    go f("goroutine")

您也可以为匿名函数调用启动一个协程。

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

现在我们的两个函数调用正在不同的协程中异步运行。等待它们完成(对于更健壮的方法,请使用 WaitGroup)。

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

当我们运行此程序时,我们首先看到阻塞调用的输出,然后是两个协程的输出。协程的输出可能是交错的,因为协程正在由 Go 运行时并发运行。

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

接下来我们将介绍并发 Go 程序中协程的补充:通道。

下一个示例:通道.