首页 > 编程语言 >go-zero 源码——syncx/limit

go-zero 源码——syncx/limit

时间:2023-07-04 11:23:39浏览次数:33  
标签:zero 源码 Limit go pool rtfsc

rtfsc: read the fucking source code

以下为源码注释:

package syncx

import (
	"errors"

	"github.com/zeromicro/go-zero/core/lang"
)

/**
 * [rtfsc]
 * 主题: limit.go
 * 摘要: 类似信号量
 * 功能: 用于控制数量,如并发数
 * [end]
 */

// ErrLimitReturn indicates that the more than borrowed elements were returned.
var ErrLimitReturn = errors.New("discarding limited token, resource pool is full, someone returned multiple times")

// Limit controls the concurrent requests.
type Limit struct {
	pool chan lang.PlaceholderType
}

// [rtfsc]
// 创建一个限制器,并规定总的数量
// [end]
// NewLimit creates a Limit that can borrow n elements from it concurrently.
func NewLimit(n int) Limit {
	return Limit{
		pool: make(chan lang.PlaceholderType, n),
	}
}

// [rtfsc]
// 占用一个信号量,通过向 channel 写入实现。
// 利用 channel 的特性,channel 满了之后再写入,就得等待
// 以此来实现限制的作用
// [end]
// Borrow borrows an element from Limit in blocking mode.
func (l Limit) Borrow() {
	l.pool <- lang.Placeholder
}

// [rtfsc]
// 归还信号量
// [end]
// Return returns the borrowed resource, returns error only if returned more than borrowed.
func (l Limit) Return() error {
	select {
	case <-l.pool:
		return nil
	default:
		return ErrLimitReturn
	}
}

// [rtfsc]
// 使用非阻塞的方式尝试获取一个信号量,获取不到则返回 false
// [end]
// TryBorrow tries to borrow an element from Limit, in non-blocking mode.
// If success, true returned, false for otherwise.
func (l Limit) TryBorrow() bool {
	select {
	case l.pool <- lang.Placeholder:
		return true
	default:
		return false
	}
}

标签:zero,源码,Limit,go,pool,rtfsc
From: https://www.cnblogs.com/xiawanxw/p/17525243.html

相关文章

  • nacos-sdk-go/v2版本 提示客户端连接不上
    nacos-sdk-gov2报错提示客户端连接不上标签(空格分隔):nacos前言nacos版本:v2nacos-sdk-go版本:v2背景:使用nacos-sdk-go来获取配置,发现一直在找缓存目录的文件,但使用openapi可以获取到配置报错信息clientnotconnected,currentstatus:STARTING提示客户端连接失败???1999-0......
  • go语言接口
    接口定义接口interface,和Java类似,是一组行为规范的集合,就是定义一组未实现的函数声明。谁使用接口就是参照接口的方法定义实现它们。type接口名interface{方法1(参数列表1)返回值列表1方法2(参数列表2)返回值列表2...}接口命名习惯在接口名后面加上......
  • Python Django 零基础从零到一部署服务,Hello Django!全文件夹目录和核心代码!
    在这篇文章中,我将手把手地教你如何从零开始部署一个使用Django框架的Python服务。无论你是一个刚开始接触开发的新手,还是一个有经验的开发者想要快速了解Django,这篇教程都会为你提供一条清晰的路径。我们将从环境搭建开始,一步一步地创建一个可以处理GET和POST请求的服务,让你能在实......
  • 语音房源码搭建技术分享之降噪功能详解
     噪音是指人们感觉到不愉快或干扰的声音,它通常是由于各种来源产生的不规则、杂乱的声音信号,噪音在我们生活中有很多的来源,像是环境噪音、社会噪音等,如果长时间暴露在噪音环境中可能导致许多健康问题,包括听力受损、睡眠障碍、心理压力增加、集中注意力困难等,而我今天要分享的知识......
  • GGTalk 开源即时通讯系统源码剖析之:数据库设计
    自从《开源即时通讯GGTalk8.0发布,增加Linux客户端,支持在统信UOS、银河麒麟上运行!》一文在博客园发布后,有园友联系我QQ,说能不能整理个更系统更详细地介绍GGTalk源码的文章,现在博客中的介绍比较零散,对于初级程序员而言,面对GGTalk大量的源码,有点不知所措。想想也是如此,于是,我打算写......
  • go get -u failed 失败 报错
    panic:internalerror:can'tfindreasonforrequirementongithub.com/pkg/[email protected][running]:cmd/go/internal/modget.(*resolver).updateBuildList.func1({{0x140000ba378,0x15},{0x14000110996,0x6}})/usr/local/go/src/cmd/go/......
  • 【HZERO】定时任务
    ......
  • Golang起步篇
    一.安装Go语言开发环境1.Wondows下搭建Go开发环境(1).下载SDK工具包sdk下载地址为:https://go.dev/dl/(2).解压下载的压缩包,放到特定的目录下,我一般放在d:/programs下(路径不能有中文或者特殊符号如空格等)(3).配置环境变量步骤1:先打开环境变量配置的界面步骤2:配置......
  • Python web 框架对比:Flask vs Django
    哈喽大家好,我是咸鱼今天我们从几个方面来比较一些现在流行的两个pythonweb框架——Flask和Django,突出它们的主要特性、优缺点和简单案例到最后,大家将更好地了解哪个框架更适合自己的特定需求参考链接:https://djangocentral.com/flask-vs-django-selecting-the-perfect-pyt......
  • 2023最新php goto完全解密系统程序
    PHPGOTO加密代码一度被认为是程序员的一大难题,但随着技术的不断进步,现在有了一款神奇的工具来解决这个问题。这款PHPGOTO解密工具拥有强大的功能,能够轻松解密和还原GOTO语句,让你的程序恢复到最初的状态。完整有效解密还原源码goto解密,基本做到免修复直接可用。Windows电脑版:https......