golang 爬虫修炼02 ---协程、互斥锁、读写锁、waitgroup
package main
import (
"fmt"
"sync"
"sync/atomic"
"time"
)
var (
count int32
wg sync.WaitGroup
mutex sync.Mutex
rwmutex sync.RWMutex
)
func main() {
// 启动读写协程
go writeData()
go readData()
// 启动10个增加计数的协程
for i := 0; i < 10; i++ {
wg.Add(1)
go incrementCount()
}
// 等待所有增加计数的协程完成
wg.Wait()
fmt.Println("最终计数:", count)
}
// 增加计数,使用原子操作来保证计数的线程安全
func incrementCount() {
defer wg.Done()
time.Sleep(time.Millisecond * 100) // 模拟耗时操作
atomic.AddInt32(&count, 1)
}
// 写数据,使用互斥锁来保证线程安全
func writeData() {
for {
mutex.Lock()
count += 100
mutex.Unlock()
time.Sleep(time.Millisecond * 100) // 模拟耗时操作
}
}
// 读数据,使用读写锁来保证线程安全
func readData() {
for {
rwmutex.RLock()
fmt.Println("读取的计数:", count)
rwmutex.RUnlock()
time.Sleep(time.Millisecond * 100) // 模拟耗时操作
}
}
这段代码模拟了一个简单的Go语言爬虫修炼(系列文章之一)中的场景,使用了互斥锁、读写锁和WaitGroup来同步和管理并发。代码中使用了原子操作来安全地增加计数,使用了Mutex来保护写操作的同步,使用了RWMutex来保护读操作的同步,并且周期性地在控制台打印出读取的计数值。这样的实践有助于理解Go语言中线程安全编程的一些基本概念。
评论已关闭