"golang.org/x/sync/semaphore" 是 Go 语言标准库中的一个第三方扩展包,它提供了一个信号量的实现,用于限制并发执行的数量。
在 Go 语言中,使用goroutine实现并发执行。当有多个goroutine同时执行时,可能会出现资源竞争的问题,例如访问共享数据结构、访问共享文件等。为了避免这些问题,可以使用信号量来限制同时执行的goroutine数量。
"golang.org/x/sync/semaphore" 的主要作用是提供一种简单的方式来控制goroutine的并发数量。它使用一个计数器来跟踪当前正在执行的goroutine数量,并提供了一组方法来获取和释放信号量,以及等待可用的信号量。
使用信号量可以有效地控制并发的数量,从而避免资源竞争的问题,提高程序的稳定性和性能。
package main
import (
"context"
"fmt"
"golang.org/x/sync/semaphore"
"time"
)
func main() {
// 创建一个初始值为 2 的信号量
sem := semaphore.NewWeighted(2)
ctx := context.Background()
// 开启 5 个 goroutine,但只允许 2 个同时执行
for i := 1; i <= 5; i++ {
go func(i int) {
// 请求信号量
if err := sem.Acquire(ctx, 1); err != nil {
fmt.Printf("goroutine %d acquire semaphore failed: %v\n", i, err)
return
}
// 执行任务
fmt.Printf("goroutine %d start running\n", i)
time.Sleep(time.Second)
fmt.Printf("goroutine %d stop running\n", i)
// 释放信号量
sem.Release(1)
}(i)
}
// 等待所有 goroutine 执行完成
time.Sleep(time.Second * 6)
}
网友评论