pub struct TokenBucket {
tokens: f64,
capacity: f64,
refill_rate: f64,
last_refill: Instant,
}Expand description
Token-bucket rate limiter. Stores the bucket state; wrap in Arc<RwLock<_>>
to share across concurrent download tasks.
Fields§
§tokens: f64Available tokens (bytes).
capacity: f64Burst capacity (bytes).
refill_rate: f64Bytes-per-second refill rate.
last_refill: InstantMonotonic timestamp of the last refill.
Implementations§
Source§impl TokenBucket
impl TokenBucket
Sourcepub fn new(bytes_per_sec: u64, capacity_factor: f64) -> Self
pub fn new(bytes_per_sec: u64, capacity_factor: f64) -> Self
Create a bucket with bytes_per_sec sustained throughput and
a burst buffer of capacity_factor seconds’ worth of tokens.
Sourcepub fn refill(&mut self)
pub fn refill(&mut self)
Replenish tokens based on elapsed wall time. Call before every consume.
Sourcepub fn try_consume(&mut self, bytes: u64) -> u64
pub fn try_consume(&mut self, bytes: u64) -> u64
Consume up to bytes tokens immediately. Returns how many were
consumed. Does not block - the caller decides what to do with remaining
deficit.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for TokenBucket
impl RefUnwindSafe for TokenBucket
impl Send for TokenBucket
impl Sync for TokenBucket
impl Unpin for TokenBucket
impl UnsafeUnpin for TokenBucket
impl UnwindSafe for TokenBucket
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
Wrap the input message
T in a tonic::Request§impl<L> LayerExt<L> for L
impl<L> LayerExt<L> for L
§fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>where
L: Layer<S>,
fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>where
L: Layer<S>,
Applies the layer to a service and wraps it in [
Layered].