1 个不稳定版本
0.1.0 | 2022年2月12日 |
---|
#1738 in Rust 模式
715 个月下载量
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