代码实现
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
semaphore := make(chan struct{}, 3)
tasks := []func(){
func() { fmt.Println("Task 1") },
func() { fmt.Println("Task 2") },
func() { fmt.Println("Task 3") },
func() { fmt.Println("Task 4") },
func() { fmt.Println("Task 5") },
}
for _, task := range tasks {
wg.Add(1)
semaphore <- struct{}{}
go func(t func()) {
defer func() {
<-semaphore
wg.Done()
}()
t()
}(task)
}
wg.Wait()
}
实现思路
- 信号量创建:通过
make(chan struct{}, 3)
创建一个带缓冲的通道 semaphore
作为信号量,缓冲大小为3,表示最多允许3个任务同时执行。
- 任务处理:遍历任务队列,对每个任务,先调用
wg.Add(1)
增加等待组计数器,然后向信号量通道 semaphore
发送一个值。这一步如果通道已满(即已有3个任务在执行),则会阻塞,直到有任务完成并从通道中取出值。
- 任务执行:在goroutine中执行任务,任务完成后,从信号量通道
semaphore
取出一个值,以释放一个信号量,允许新的任务进入,同时调用 wg.Done()
减少等待组计数器。
- 等待任务完成:使用
wg.Wait()
等待所有任务完成,确保所有任务执行完毕后程序才退出。