Go语言并发编程基础
发布时间: 2024-03-06 20:11:38 阅读量: 29 订阅数: 27
# 1. Go语言并发编程基础概述
## 1.1 什么是并发编程
在计算机领域,所谓并发是指一个时间段内发生了多个事件。并发编程是指程序设计中允许多个事件同时发生,通过利用多核处理器的计算能力,提高程序执行效率和性能。
## 1.2 Go语言并发编程的优势
Go语言是一门支持原生并发的编程语言,通过Goroutine和Channel等语言特性,Go语言在并发编程方面有诸多优势,如高效的并发控制、低成本的并发处理等。
## 1.3 并发编程的基本概念和术语
在并发编程中,常涉及Goroutine、Channel、同步、异步、竞态条件、互斥锁等术语和概念。这些都是Go语言并发编程的基础概念,我们将在后续章节中逐一详细介绍和讲解。
# 2. Go语言并发基础知识
在Go语言中,并发是一种非常强大且重要的特性,它通过Goroutine和Channel的组合来实现。在本章中,我们将深入探讨Go语言中并发编程的基础知识,包括Goroutine的概念、Channel的使用以及Select语句的应用。
### 2.1 Goroutine:Go语言并发的基本单元
Goroutine是Go语言并发的基本单元,它类似于线程,但由Go运行时环境管理,可高效地并发执行。下面是一个简单的例子,展示如何创建和启动一个Goroutine:
```go
package main
import (
"fmt"
"time"
)
func sayHello() {
for i := 0; i < 5; i++ {
fmt.Println("Hello Goroutine")
time.Sleep(1 * time.Second)
}
}
func main() {
go sayHello() // 启动一个Goroutine
time.Sleep(2 * time.Second) // 主Goroutine等待2秒
fmt.Println("Main function")
}
```
**代码解析:**
- `go sayHello()` 创建并启动一个新的Goroutine来执行函数`sayHello()`
- 主Goroutine会休眠2秒后输出"Main function"
- `sayHello()`函数会输出"Hello Goroutine"五次,每次间隔1秒
**代码执行结果:**
```
Hello Goroutine
Main function
Hello Goroutine
Hello Goroutine
Hello Goroutine
Hello Goroutine
```
通过以上例子,我们可以看到如何使用Goroutine实现并发执行。下面我们将继续介绍Channel的使用以及Select语句的应用。
# 3. Goroutine的创建和管理
在本章中,我们将深入了解Go语言中Goroutine的创建、生命周期管理以及调度和性能优化等方面的内容。
#### 3.1 Goroutine的创建方法和原理
Goroutine是Go语言中并发编程的基本单元,它类似于线程,但由Go语言运行时环境(runtime)进行管理,比传统线程更轻量级。我们可以通过关键字`go`来创建一个Goroutine,示例如下:
```go
package main
import (
"fmt"
"time"
)
func sayHello() {
for i := 0; i < 5; i++ {
fmt.Println("Hello, Goroutine")
time.Sleep(1 * time.Second)
}
}
func main() {
go sayHello()
time.Sleep(2 * time.Second) // 等待一段时间,确保Goroutine有足够时间执行
fmt.Println("Main function")
}
```
上面的示例中,我们使用`go sayHello()`创建了一个Goroutine,它会并发执行`sayHello`函数中的内容。在`main`函数中,我们使用`time.Sleep`等待2秒,以确保Goroutine有足够的时间来执行。运行程序后,你会发现"Hello, Goroutine"和"Main function"交替输出,展现了Goroutine并发执行的效果。
#### 3.2 Goroutine的生命周期管理
每个Goroutine都有自己的生命周期,它会被创建、运行和最终结束。当一个Goroutine的函数执行结束时,这个Goroutine也随之结束。我们也可以通过`WaitGroup`来等待多个Goroutine全部执行完毕。
```go
package main
import (
"fmt"
"sync"
"time"
)
func work(id int, wg *sync.WaitGroup) {
defer wg.Done() // 在函数退出前调用Done,等价于wg.Add(-1)
fmt.Printf("Worker %d starting\n", id)
time.Sleep(time.Second)
fmt.Printf("Worker %d done\n", id)
}
func main() {
var wg sync.WaitGroup
for i := 1; i <= 5; i++ {
wg.Add(1) // 每启动一个Goroutine前加1
go work(i, &wg)
}
wg.Wait() // 等待所有Goroutine执行完毈
fmt.Println("All workers done")
}
```
运行上面的示例,你会看到每个Worker被并发执行,最终输出"All workers done",表明所有Goroutine已经执行完毕。
#### 3.3 Goroutine的调度和性能优化
0
0