An open API service indexing awesome lists of open source software.

https://github.com/mikecaines/stream-throttle

Rust Stream combinator, to limit the rate at which items are produced
https://github.com/mikecaines/stream-throttle

async futures rust stream throttle

Last synced: 3 months ago
JSON representation

Rust Stream combinator, to limit the rate at which items are produced

Awesome Lists containing this project

README

          

# stream_throttle
Provides a
[Rust](https://www.rust-lang.org)
[`Stream`](https://docs.rs/futures/0.3/futures/stream/trait.Stream.html)
combinator, to limit the rate at which items are produced.

[![Crates.io](https://img.shields.io/crates/v/stream_throttle.svg)](https://crates.io/crates/stream_throttle)
[![API Documentation](https://docs.rs/stream_throttle/badge.svg)](https://docs.rs/stream_throttle/)

## Key Features
- Throttling is implemented via
[`poll()`](https://docs.rs/futures/0.3/futures/future/trait.Future.html#tymethod.poll),
and not via any sort of buffering.
- The throttling behaviour can be applied to both `Stream`'s and `Future`'s.
- Multiple streams/futures can be throttled together as a group.
- Feature flags to use various timer implementations.

## Feature Flags
- `timer-tokio`: Uses the `tokio::time::delay_for()` timer.
- `timer-futures-timer`: Uses the `futures_timer::Delay` timer.

If you don't use the default timer (`tokio`), make sure to set `default-features = false`
in your `Cargo.toml`, when you add `stream_throttle` as a dependency.

## Example throttling of `Stream`
```rust
// allow no more than 5 items every 1 second
let rate = ThrottleRate::new(5, Duration::new(1, 0));
let pool = ThrottlePool::new(rate);

let work = stream::repeat(())
.throttle(pool)
.then(|_| futures::future::ready("do something else"))
.for_each(|_| futures::future::ready(()));

work.await;
```

## Example throttling of `Future`
```rust
let rate = ThrottleRate::new(5, Duration::new(1, 0));
let pool = ThrottlePool::new(rate);

let work = pool.queue()
.then(|_| futures::future::ready("do something else"));

work.await;
```