#duration #once #interval #millis #expression #rate-limiting #macro

only_every

一个简单的速率限制宏:only_every!(Duration::from_millis(200), expensive_expression)

1 个不稳定版本

0.1.0 2022年2月12日

#1738 in Rust 模式

Download history 230/week @ 2024-03-15 283/week @ 2024-03-22 184/week @ 2024-03-29 197/week @ 2024-04-05 312/week @ 2024-04-12 185/week @ 2024-04-19 241/week @ 2024-04-26 85/week @ 2024-05-03 224/week @ 2024-05-10 168/week @ 2024-05-17 313/week @ 2024-05-24 176/week @ 2024-05-31 235/week @ 2024-06-07 190/week @ 2024-06-14 150/week @ 2024-06-21 103/week @ 2024-06-28

715 个月下载量

Unlicense

10KB
119

only_every

有很多速率限制包可以做很多事情,但有时你只想每隔一定时间评估一次表达式,例如速率限制日志记录。这个包公开了一个宏

only_every!(Duration::from_millis(100), expensive_thing)

这个宏将评估给定的表达式,最多每隔指定的持续时间向上取整到下一个毫秒。限制器是全局的:如果你使用20个线程,它仍然每隔指定的时间才会发生一次。表达式不在闭包内部,因此对借用检查器来说更透明(这对你可能没有影响;你可以将其理解为“没有边缘情况”)。

为了更快的时间计算,以使用 quanta crate 为代价,启用 quanta 功能,该功能在执行第一个速率限制表达式时需要校准周期和一个 O(1) 堆分配。如果你用 quanta 做其他事情,先到的人负责校准。

如果你需要更多,例如将这些存储在结构体中而不是使用宏,还有一个 OnlyEvery 类型。如果你需要比“每x执行一次”更多的功能,我建议使用 governor

为了完整性,我们在 i64 中内部保留时间,以毫秒为单位,自进程开始以来。如果你的进程运行时间足够长,以至于 pt + interval > i64::MAX,其中 pt 是进程的运行时间,单位是毫秒,行为是未定义的。换句话说,如果你有连续运行超过一亿年的进程,请告诉我,我会为你修复它。

依赖关系

~0–1.8MB
~31K SLoC