Goroutine的创建和使用
Goroutine 是 Go 语言中轻量级的并发执行单元,由 Go 运行时管理。其创建成本极低(初始栈仅 $2$KB),且通过 GMP 调度模型实现高效并发。以下分步说明:
1. 创建 Goroutine
使用 go 关键字直接启动,语法为:
go funcName(args) // 执行函数
或匿名函数:
go func() {
// 并发逻辑
}(args)
2. 基础示例
package main
import (
"fmt"
"time"
)
func printNumbers() {
for i := 1; i <= 3; i++ {
fmt.Printf("Number: $%d$\n", i)
time.Sleep(200 * time.Millisecond)
}
}
func main() {
go printNumbers() // 启动 Goroutine
// 主 Goroutine 同时执行
fmt.Println("Main starts")
time.Sleep(1 * time.Second) // 等待子 Goroutine
fmt.Println("Main ends")
}
输出可能为:
Main starts
Number: $1$
Number: $2$
Number: $3$
Main ends
3. 关键特性
- 并发模型:GMP 调度器(Goroutine/Machine/Processor)复用线程
- 通信机制:通过 Channel 同步数据(避免共享内存竞争)
- 退出控制:主 Goroutine 结束时所有子 Goroutine 强制终止
4. 同步实践(使用 Channel)
func worker(done chan bool) {
fmt.Println("Working...")
time.Sleep(500 * time.Millisecond)
done <- true // 发送完成信号
}
func main() {
done := make(chan bool)
go worker(done)
<-done // 阻塞直到收到信号
fmt.Println("Task completed")
}
5. 注意事项
- 资源泄漏:避免创建无限制的 Goroutine(需用池化技术)
- 竞态检测:运行时添加
-race标志检查数据竞争 - 调度开销:当 Goroutine 数量 $N$ 极大时,调度延迟 $\Delta t$ 可能增长
通过 Goroutine 可实现高并发 I/O 密集型任务,例如单个进程轻松支撑 $10^4$ 级并发连接。
Goroutine的创建与使用详解
664

被折叠的 条评论
为什么被折叠?



