github.com/songzhibin97/gkit@v1.2.13/restrictor/limiter.go (about)

     1  package restrictor
     2  
     3  import (
     4  	"context"
     5  	"time"
     6  )
     7  
     8  type Allow interface {
     9  	// Allow AllowN(time.Now(),1)
    10  	Allow() bool
    11  	// AllowN 截止到某一时刻,目前桶中数目是否至少为 n 个,满足则返回 true,同时从桶中消费 n 个 token
    12  	AllowN(now time.Time, n int) bool
    13  }
    14  
    15  type Wait interface {
    16  	// Wait WaitN(ctx,1)
    17  	Wait(ctx context.Context) error
    18  	// WaitN 如果此时桶内 Token 数组不足 (小于 N),那么 Wait 方法将会阻塞一段时间,直至 Token 满足条件。如果充足则直接返回
    19  	// 我们可以设置 context 的 Deadline 或者 Timeout,来决定此次 Wait 的最长时间。
    20  	WaitN(ctx context.Context, n int) error
    21  }
    22  
    23  // AllowFunc 实现 Allow 接口
    24  type AllowFunc func(now time.Time, n int) bool
    25  
    26  func (a AllowFunc) Allow() bool {
    27  	return a.AllowN(time.Now(), 1)
    28  }
    29  
    30  func (a AllowFunc) AllowN(now time.Time, n int) bool {
    31  	return a(now, n)
    32  }
    33  
    34  // WaitFunc 实现 Wait 接口
    35  type WaitFunc func(ctx context.Context, n int) error
    36  
    37  func (w WaitFunc) Wait(ctx context.Context) error {
    38  	return w.WaitN(ctx, 1)
    39  }
    40  
    41  func (w WaitFunc) WaitN(ctx context.Context, n int) error {
    42  	return w(ctx, n)
    43  }