Go 使用信号量限制并发数和控制多个进程的执行顺序
warning:
这篇文章距离上次修改已过187天,其中的内容可能已经有所变动。
package main
import (
"fmt"
"sync"
"sync/atomic"
"time"
)
func main() {
// 设置信号量的容量为3,用于限制并发数
var sem = make(chan struct{}, 3)
var wg sync.WaitGroup
var count int32
for i := 0; i < 10; i++ {
wg.Add(1)
go func(id int) {
defer wg.Done()
// 获取信号量
sem <- struct{}{}
defer func() {
// 释放信号量
<-sem
}()
// 模拟耗时操作
time.Sleep(time.Second)
// 原子操作增加计数
atomic.AddInt32(&count, 1)
fmt.Println("Process", id, "completed. Count:", count)
}(i)
}
wg.Wait()
fmt.Println("All processes completed. Count:", count)
}
这段代码使用了信号量来限制并发执行的 goroutine 数量,并通过 sync.WaitGroup
来等待所有 goroutine 完成。使用 atomic.AddInt32
来确保计数过程中的线程安全。这是一个典型的并发控制的例子,适合学习并发编程的初学者。
评论已关闭