syncx.Limit
syncx
包提供了一种管理并发请求的限流机制。通过定义一个 Limit
类型,可以控制同时进行的请求数量。
变量
ErrLimitReturn
var ErrLimitReturn = errors.New("discarding limited token, resource pool is full, someone returned multiple times")
ErrLimitReturn
表示当归还的元素超过借用的数量时,资源池已满的错误信息。
类型
Limit
type Limit struct {
pool chan lang.PlaceholderType
}
Limit
是一个包含带缓冲通道 pool
的结构体,用于控制并发请求的数量。
函数
NewLimit
func NewLimit(n int) Limit
NewLimit
创建一个可以同时借用 n
个元素的 Limit
实例。
参数
n
(int
): 可同时借用的元素数量。
返回值
Limit
: 一个新的Limit
实例。
Borrow
func (l Limit) Borrow()
Borrow
方法以阻塞模式借用一个元素。
Return
func (l Limit) Return() error
Return
方法归还借用的资源。如果归还的资源超过借用的数量,则返回错误 ErrLimitReturn
。
返回值
error
: 如果归还成功返回nil
,否则返回ErrLimitReturn
错误。
TryBorrow
func (l Limit) TryBorrow() bool
TryBorrow
方法以非阻塞模式尝试借用一个元素。
返回值
bool
: 如果成功借用,返回true
,否则返回false
。
用法示例
package main
import (
"fmt"
"log"
"syncx"
)
func main() {
limit := syncx.NewLimit(2)
if limit.TryBorrow() {
fmt.Println("Successfully borrowed the first token.")
} else {
fmt.Println("Failed to borrow the first token.")
}
if limit.TryBorrow() {
fmt.Println("Successfully borrowed the second token.")
} else {
fmt.Println("Failed to borrow the second token.")
}
if limit.TryBorrow() {
fmt.Println("Successfully borrowed the third token.")
} else {
fmt.Println("Failed to borrow the third token.")
}
err := limit.Return()
if err != nil {
log.Println("Error returning token:", err)
} else {
fmt.Println("Successfully returned a token.")
}
err = limit.Return()
if err != nil {
log.Println("Error returning token:", err)
} else {
fmt.Println("Successfully returned a token.")
}
}