go语言的semaphore

2023-03-29  本文已影响0人  鸿雁长飞光不度

"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)
}
上一篇 下一篇

猜你喜欢

热点阅读