throttle_my_fn is a Rust attribute macro to limit a function's number of runs over a
specified period of time, even when called from multiple threads.
The primary use-case for this attribute macro is rate-limiting, e.g. to avoid hammering an online service or to avoid serving too many requests over a period of time.
The macro works by rewriting the function and prefixing it with the necessary book-keeping
for throttling (see Usage below). The resulting function is thread-safe.
Add the necessary dependencies to your Cargo.toml:
[dependencies]
throttle_my_fn = "0.2"
parking_lot = "0.11"Or, using cargo add:
$ cargo add throttle_my_fn
$ cargo add parking_lotInclude the macro:
use throttle_my_fn::throttle;Annotate the functions you want to throttle:
#[throttle(10, Duration::from_secs(1))]
pub(crate) fn run_10_times_per_second(arg: &str) -> String {
...
}
#[throttle(1, Duration::from_millis(100))]
pub(crate) fn run_once_per_100_milliseconds(arg: &str) -> String {
...
}Note that the function signatures are modified to wrap the return type in an Option,
like so:
pub(crate) fn run_10_times_per_second(arg: &str) -> Option<String> {
...
}
pub(crate) fn run_once_per_100_milliseconds(arg: &str) -> Option<String> {
...
}The Option<T> returned signifies whether the function executed or not.
-
0.2.6
- Fix compilation error with functions that have 2+ arguments.
-
0.2.5
- README fixes.
-
0.2.4
- Ignore example doctests.
- Update documentation about also adding
parking_lotas a dependency.
-
0.2.3
- Add this Changelog section to the README.
-
0.2.2
- Documentation updates regarding thread-safety.
-
0.2.1
- Documentation update about possible use cases for this crate.
- Thanks go to
@not-matthiasfrom the Rust Linz Discord server for feedback.
-
0.2.0
- Replace the use of
MaybeUninitandAtomicBoolwithparking_lot::Mutexandparking_lot::const_mutex. - Thanks go to
@mejrsand@veber-alexfrom the Rust Discord server for feedback.
- Replace the use of
-
0.1.0
- Initial release