Golang 并发之 Goroutine
Goroutine 是 Go 编程语言中的一个重要概念。它是 Go 语言实现并发的基础,可以简单地理解为 Go 语言中的轻量级线程。
具体来说,Goroutine 有以下特点:
1.轻量级:
Goroutine 的创建和切换都非常快速,只需要几微秒。这与操作系统级别的线程相比要快得多。
2.并发性:
Goroutine 可以并发执行,意味着可以同时执行多个 Goroutine。Go 运行时会自动管理 Goroutine 的调度和执行。
3.独立性:
每个 Goroutine 都有自己的栈空间、程序计数器和其他必要的运行时数据结构。Goroutine 之间是相互独立的。
4.易用性:
创建 Goroutine 非常简单,只需要使用 go
关键字就可以了。
package main
import (
"fmt"
"sync"
"time"
)
func main() {
// 示例 1:并发性
fmt.Println("示例 1: 并发性")
var wg sync.WaitGroup
wg.Add(2)
// 启动两个 Goroutine 并发执行
go func() {
defer wg.Done()
performTask("Goroutine 1")
}()
go func() {
defer wg.Done()
performTask("Goroutine 2")
}()
// 等待两个 Goroutine 执行完毕
wg.Wait()
fmt.Println("示例 1 完成")
// 示例 2:独立性
fmt.Println("\n示例 2: 独立性")
var data int = 0
go func() {
data++
fmt.Println("Goroutine 1 修改 data 为:", data)
}()
go func() {
data--
fmt.Println("Goroutine 2 修改 data 为:", data)
}()
// 给 Goroutine 一些时间执行
time.Sleep(1 * time.Second)
fmt.Println("main 函数中 data 的值:", data)
// 示例 3:创建 Goroutine
fmt.Println("\n示例 3: 创建 Goroutine")
go func() {
fmt.Println("这是一个新的 Goroutine")
}()
fmt.Println("这是 main 函数中的代码")
time.Sleep(1 * time.Second)
}
// 模拟一个耗时的任务
func performTask(name string) {
fmt.Printf("开始执行 %s 任务\n", name)
time.Sleep(2 * time.Second)
fmt.Printf("%s 任务执行完毕\n", name)
}