47 lines
1.1 KiB
Go
47 lines
1.1 KiB
Go
// Package limiter provides concurrency limiters.
|
|
package limiter
|
|
|
|
// Fixed is a simple channel-based concurrency limiter. It uses a fixed
|
|
// size channel to limit callers from proceeding until there is a value available
|
|
// in the channel. If all are in-use, the caller blocks until one is freed.
|
|
type Fixed chan struct{}
|
|
|
|
func NewFixed(limit int) Fixed {
|
|
return make(Fixed, limit)
|
|
}
|
|
|
|
// Idle returns true if the limiter has all its capacity is available.
|
|
func (t Fixed) Idle() bool {
|
|
return len(t) == cap(t)
|
|
}
|
|
|
|
// Available returns the number of available tokens that may be taken.
|
|
func (t Fixed) Available() int {
|
|
return cap(t) - len(t)
|
|
}
|
|
|
|
// Capacity returns the number of tokens can be taken.
|
|
func (t Fixed) Capacity() int {
|
|
return cap(t)
|
|
}
|
|
|
|
// TryTake attempts to take a token and return true if successful, otherwise returns false.
|
|
func (t Fixed) TryTake() bool {
|
|
select {
|
|
case t <- struct{}{}:
|
|
return true
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
|
|
// Take attempts to take a token and blocks until one is available.
|
|
func (t Fixed) Take() {
|
|
t <- struct{}{}
|
|
}
|
|
|
|
// Release releases a token back to the limiter.
|
|
func (t Fixed) Release() {
|
|
<-t
|
|
}
|