美文网首页
go语言的semaphore

go语言的semaphore

作者: 鸿雁长飞光不度 | 来源:发表于2023-03-29 00:19 被阅读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)
}

相关文章

  • semaphore的应用实战

    go 官方扩展库中提供了对 semaphore (信号量)的封装以供使用。用 semaphore 的特性来做一个限...

  • 潍坊go语言培训

    潍坊go语言培训潍坊go语言培训潍坊go语言培训潍坊go语言培训潍坊go语言培训潍坊go语言培训潍坊go语言培训潍...

  • 初识Go语言-1

    Go语言学习路径 初识Go语言 Go语言环境搭建与IDE安装 Go语言基础语法 Go语言数据类型 Go语言变量和常...

  • Go语言入坑

    GO语言基础 认识并安装GO语言开发环境 Go语言简介 Go语言是谷歌2009年发布的第二款开源编程语言 go语言...

  • Go 语言学习技巧和编程思维

    Go 语言学习技巧和编程思维 一、了解 Go 语言 了解 Go 语言背景 学习 Go 语言,首先要了解 Go 语言...

  • 第十六章:Go语言面向对象编程

    1. GO语言OOP概述 Go语言不是纯粹的面向对象的语言,准确是描述是,Go语言支持面向对象编程的特性.Go语言...

  • golang的helloworld

    go语言初识 go语言的变量

  • go语言基础

    go语言基础 go 语言接口

  • Go语言并发

    Go语言并发 Go语言级别支持协程,叫做goroutine Go 语言从语言层面支持并发和并行的开发操作 Go并发...

  • 并发编程

    学习来源:Go语言实战、blibli 黑马程序员 20小时快速入门go语言(中) Go语言的优势 Go语言设计简单...

网友评论

      本文标题:go语言的semaphore

      本文链接:https://www.haomeiwen.com/subject/qjhtddtx.html