go高并发之路——go语言如何解决并发问题
在Go语言中,并发编程主要通过goroutine和channel来实现。
使用goroutine:
Go语言中可以轻松创建并发任务,通过go关键字可以开启一个新的goroutine。
package main
import (
"fmt"
"time"
)
func printNumbers() {
for i := 1; i <= 5; i++ {
fmt.Println(i)
time.Sleep(100 * time.Millisecond)
}
}
func printLetters() {
for i := 'a'; i <= 'e'; i++ {
fmt.Println(string(i))
time.Sleep(100 * time.Millisecond)
}
}
func main() {
go printNumbers() // 开启一个goroutine打印数字
go printLetters() // 开启一个goroutine打印字母
time.Sleep(1000 * time.Millisecond) // 主goroutine休眠,等待其他goroutine执行
}
使用channel:
Channel是Go语言中的一个重要数据类型,它可以用来在不同的goroutine之间同步、传递数据。
package main
import (
"fmt"
"sync"
"sync/atomic"
"time"
)
var (
count int32
wg sync.WaitGroup
mutex sync.Mutex
)
func increment(wg *sync.WaitGroup, lock *sync.Mutex) {
defer wg.Done() // 当函数退出时,通知WaitGroup一个goroutine已经完成
for i := 0; i < 2; i++ {
lock.Lock() // 加锁
atomic.AddInt32(&count, 1) // 原子操作,安全的递增count
time.Sleep(1 * time.Millisecond)
lock.Unlock() // 解锁
time.Sleep(1 * time.Millisecond)
}
}
func main() {
wg.Add(2) // 设置WaitGroup的计数器为2
go increment(&wg, &mutex) // 开启一个goroutine执行increment函数
go increment(&wg, &mutex) // 开启另一个goroutine执行increment函数
wg.Wait() // 等待所有goroutine完成
fmt.Println("Count:", count) // 打印最终的count值
}
以上两种方式是Go语言中常用的并发编程手段,可以有效地解决并发问题。在实际开发中,还可以使用其他的并发模式,如select、runtime包中的Gosched和GOMAXPROCS等,来优化并发程序的性能。
评论已关闭