#rate-limiting #timer #limit #rpm #rate #periodically

rpm-timer

一个小巧简单的工具,可以将您的处理速度限制为每分钟(或每秒)指定数量的项目。非常适合速率限制的API。

3 个版本

使用旧的 Rust 2015

0.0.3 2018年1月7日
0.0.2 2017年12月16日
0.0.1 2017年12月16日

#5 in #periodically

MIT 许可证

21KB
134 代码行,不包括注释

概述

RpmTimer (每分钟请求计时器) 是一个工具,可以将您的处理速度限制为每分钟的请求数量(例如请求)。

它旨在与任何速率限制的API一起使用。

Crates.io license Build Status

文档

存储库

入门指南

首先,您必须将此依赖项添加到您的 Cargo.toml

[dev-dependencies]
rpm-timer = "0.0.3"

然后,在您的 lib.rsmain.rs 文件中包含 rpm_timer crate

extern crate rpm_timer;

最后,在您想要限制处理速度的模块中使用 RpmTimer

use rpm_timer::RpmTimer;

示例

为了避免不必要的内存分配,run 函数有两种版本。

  1. run_slices 接受切片并将子切片传递给处理函数
extern crate rpm_timer;

use rpm_timer::RpmTimer;

fn send_slice(requests: Vec<String>) {
    RpmTimer::default()
        .rpm_limit(100.0)
        .run_slice(&requests, send_http_requests);
}

fn send_http_requests(requests: &[&String]) {
    // process all requests here
}
  1. run_iter 接受任何迭代器,收集项目并将每个部分作为 Vec 传递给处理函数:processing
extern crate rpm_timer;

use rpm_timer::RpmTimer;

fn send_slice(reader: BufReader) {
    let lines = reader.lines();

    RpmTimer::default()
        .rpm_limit(100.0)
        .run_iter(lines, send_http_requests);
}

fn send_http_requests(requests: Vec<Result<String, io::Error>>) {
    // process all requests here
}

请检查 examples 目录以获取更详细的工作示例。

描述

RpmTimer 在滴答间隔内工作。您可以使用 tick 方法调整滴答长度。每个滴答它检查是否有任何空闲的工作线程(线程的数量可以用 max_threads 调整)以及应该处理多少项目以实现请求的速度。如果有需要处理的项目,RpmTimer 将它们收集到切片(在不分配版本中)或 Vec(在分配版本中),并在并行中触发处理函数。

可视化

假设有2个工作线程和500毫秒的滴答时间。此外,假设在第2秒和第3秒之间存在延迟(例如,CPU忙于其他进程)

60 RPM = 1 RPS = 1 每秒1个请求

Time                     0   0.5   1   1.5   2   2.5   3   3.5
Main Thread:             |....X....X....X....X.........X....X..
Number of items 'ready'  1   0.5   1   0.5   1         2   0.5
Worker #1                1**********************.......2******.
Worker #2                ..........1**************.............
                                             ^         ^
                                             |         |- 2 items sent to the thread
                                             |- an item is ready but no worker threads available

30 RPM = 0.5 RPS = 1 每两秒1个请求

Time                     0   0.5   1   1.5   2   2.5   3   3.5
Main Thread:             |....X....X....X..............X....X..
Number of items 'ready'  1  0.25  0.5  0.75  1  0.25  0.5  0.75
Worker #1                1***********..........................
Worker #2                ....................1************.....

图例

  • . - 睡眠
  • X - 主线程的 tick
  • * - 忙于 # 请求

贡献

所有贡献和评论都热烈欢迎!不要害怕在发现错误或想改进此crate的想法时打开一个issue或PR。

许可证

MIT许可证

版权所有(c)2017 Marcin Sas-Szymański

特此授予任何人,免费、无限制地使用本软件及其相关文档文件(以下简称“软件”)的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本,以及允许向其提供软件的个人这样做,但受以下条件限制

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

软件按“原样”提供,不提供任何形式的质量保证,无论是明示的还是暗示的,包括但不限于适销性、特定目的的适用性和非侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任承担责任,无论是在合同、侵权或其他法律行为中,无论源于、源于或与软件或其使用或其他交易有关。

依赖关系

~140KB