Golang并发编程重点讲解
简介
Golang是一门支持并发编程的语言,它提供了丰富的原生并发编程特性,如goroutine和channel等,同时也提供了一些标准库,如sync、atomic和context等,能够帮助我们更加方便的完成并发编程任务。本文将以Golang并发编程为主题,介绍Golang并发编程的关键知识点。
知识点
1. Goroutine
Goroutine是Golang中的轻量级线程,可以将一个函数或方法包装成一个Goroutine,实现并行调用。创建一个Goroutine非常简单,只需要在函数或方法执行前加上go
关键字即可。
go func() {
// 执行逻辑
}()
2. Channel
Channel是Golang中的一个关键特性,用于支持Goroutine之间的通信和数据共享。Channel本质上是一种队列结构,支持数据的发送和接收,并且可以被多个Goroutine同时访问。
ch := make(chan int) // 创建一个int类型的channel
ch <- 1 // 发送1到channel中
x := <-ch // 从channel中接收数据,赋值给变量x
3. Mutex
Mutex是Golang的互斥锁,用于保护共享资源的访问。当多个Goroutine对同一个变量进行读写时,很可能会出现数据竞争问题,会导致程序产生不可预测的结果。这时我们需要使用Mutex来保证同一时间只有一个Goroutine能够访问共享资源。
var mu sync.Mutex // 创建一个互斥锁
var val int // 共享变量
func foo() {
mu.Lock() // 加锁
val++
mu.Unlock() // 解锁
}
4. WaitGroup
WaitGroup是Golang中的等待组,用于等待一组Goroutine的执行完成。当我们需要并行执行多个任务,并等待所有任务执行完成后再继续执行下一步时,可以使用WaitGroup来实现这一功能。
var wg sync.WaitGroup // 创建一个等待组
func foo() {
wg.Add(1) // 待执行任务数加1
go func() {
// 执行逻辑
wg.Done() // 待执行任务数减1
}()
}
wg.Wait() // 等待所有任务完成
示例说明
示例一:计算斐波那契数列
下面展示一个通过Goroutine和Channel实现的斐波那契数列计算例子,用于演示Goroutine和Channel的基本用法。
func fibonacci(n int, c chan int) {
x, y := 0, 1
for i := 0; i < n; i++ {
c <- x // 将斐波那契数列中的数发送到channel中
x, y = y, x+y
}
close(c) // 关闭channel
}
func main() {
c := make(chan int, 10)
go fibonacci(cap(c), c)
for i := range c { // 从channel中取出计算结果
fmt.Println(i)
}
}
在执行过程中,我们通过发送斐波那契数列中的数到channel中,然后通过range循环读取channel中的结果,最后打印输出。
示例二:加法器
下面展示一个通过WaitGroup和Mutex实现的加法器例子,用于演示WaitGroup和Mutex的基本用法。
var mu sync.Mutex // 创建互斥锁
var wg sync.WaitGroup // 创建等待组
var sum int // 共享变量
func adder(start, end int) {
defer wg.Done() // 调用完成执行wg.Done()操作
for i := start; i <= end; i++ {
mu.Lock() // 加锁
sum += i
mu.Unlock() // 解锁
}
}
func main() {
wg.Add(3) // 添加3个待执行的任务
go adder(1, 1000)
go adder(1001, 2000)
go adder(2001, 3000)
wg.Wait() // 等待所有任务完成
fmt.Println(sum)
}
在执行过程中,我们创建了三个加法器任务,并使用WaitGroup来等待所有任务执行完成。在每个任务中,我们通过互斥锁来保护共享变量的访问,从而避免了数据竞争问题。最终,我们将所有加法器计算结果相加,并输出到控制台。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Golang并发编程重点讲解 - Python技术站