1.5 深入理解Go并发编程:Goroutine和Channel实战详解
引言
Go语言的并发模型是其最强大的特性之一。通过goroutine和channel,Go语言让并发编程变得简单而优雅。本文将深入解析goroutine和channel的原理和使用方法,帮助你掌握Go语言的并发编程精髓。
一、Goroutine基础
1.1 什么是Goroutine
Goroutine是Go语言的轻量级线程,由Go运行时管理。相比传统线程,goroutine的创建和切换成本极低。
packagemainimport("fmt""time")funcsayHello(namestring){fori:=0;i<5;i++{fmt.Printf("Hello from %s: %d\n",name,i)time.Sleep(100*time.Millisecond)}}funcmain(){// 顺序执行sayHello("Alice")sayHello("Bob")// 并发执行gosayHello("Charlie")gosayHello("David")// 等待goroutine完成time.Sleep(1*time.Second)}1.2 Goroutine vs 线程
| 特性 | Goroutine | 线程 |
|---|---|---|
| 创建成本 | 2KB栈 | 1-2MB栈 |
| 切换成本 | 纳秒级 | 微秒级 |
| 数量限制 | 百万级 | 千级 |
| 调度方式 | M:N模型 | 1:1模型 |
1.3 Goroutine的调度模型
Go使用M:N调度模型:
- M: 操作系统线程
- P: 处理器(逻辑CPU)
- G: Goroutine