在 Go 语言中,Goroutine 是一种轻量级的并发执行单元,可以理解为 Go 的“协程”。
它由 Go 运行时管理,用于执行函数或任务。Goroutine 的轻量级和高效并发特性使 Go 能够轻松处理数千甚至数百万个并发任务,适合构建高并发的服务器和网络应用。
Goroutine 的启动
Goroutine 通过 go
关键字启动
package main
import (
"fmt"
"time"
)
func sayHello() {
fmt.Println("Hello, World!")
}
func main() {
go sayHello() // 启动一个新的 Goroutine 来执行 sayHello 函数
time.Sleep(time.Second) // 给 Goroutine 足够的时间执行
}
在上面的代码中,sayHello
函数在一个新的 Goroutine 中执行,而主函数继续执行下去。
time.Sleep(time.Second)
是为了确保 sayHello
有时间输出,因为主函数在没有同步机制的情况下会立即结束。
Goroutine 与主 Goroutine
每个 Go 程序都会从一个默认的 Goroutine(即主 Goroutine)开始执行。在主 Goroutine 中,可以启动其他 Goroutine。当主 Goroutine 结束时,程序会立即退出,不论其他 Goroutine 是否完成。因此,在实际使用中,通常需要同步 Goroutine 的执行。
4. Goroutine 的同步和通信
由于 Goroutine 是并发执行的,往往需要同步和通信。Go 提供了 通道(Channel) 来实现 Goroutine 之间的数据传递和同步。通道是 Go 原生的同步机制,用于在 Goroutine 之间安全地传递数据。
示例:Goroutine 和通道
package main
import (
"fmt"
)
func greet(done chan bool) {
fmt.Println("Hello from Goroutine")
done <- true // 向通道发送信号
}
func main() {
done := make(chan bool)
go greet(done) // 启动 Goroutine
<-done // 等待 Goroutine 完成
fmt.Println("Main Goroutine Finished")
}
在此代码中,主 Goroutine 启动了 greet
Goroutine,并通过 done
通道等待 greet
执行完成后再继续。