#byte-stream #async-io #async-read #async-write #speed #future #multiple

async-speed-limit

异步限制多个字节流的速率

6个版本 (3个重大更新)

0.4.1 2023年8月7日
0.4.0 2021年9月15日
0.3.1 2020年12月11日
0.3.0 2020年2月23日
0.1.0 2020年1月3日

#104 in 异步

Download history 786/week @ 2024-04-08 686/week @ 2024-04-15 787/week @ 2024-04-22 685/week @ 2024-04-29 1016/week @ 2024-05-06 902/week @ 2024-05-13 876/week @ 2024-05-20 855/week @ 2024-05-27 1254/week @ 2024-06-03 1040/week @ 2024-06-10 1221/week @ 2024-06-17 987/week @ 2024-06-24 959/week @ 2024-07-01 1064/week @ 2024-07-08 1540/week @ 2024-07-15 1006/week @ 2024-07-22

4,702次月下载
3个库中使用(通过yocalhost

MIT/Apache

67KB
1.5K SLoC

async-speed-limit

Build status Latest Version Documentation

异步限制多个字节流的速率(AsyncReadAsyncWrite)。

使用方法

use async_speed_limit::Limiter;
use futures_util::{
    future::try_join,
    io::{self, AsyncRead, AsyncWrite},
};
use std::{marker::Unpin, pin::Pin};

#[cfg(feature = "standard-clock")]
async fn copy_both_slowly(
    r1: impl AsyncRead,
    w1: &mut (impl AsyncWrite + Unpin),
    r2: impl AsyncRead,
    w2: &mut (impl AsyncWrite + Unpin),
) -> io::Result<()> {
    // create a speed limiter of 1.0 KiB/s.
    let limiter = <Limiter>::new(1024.0);

    // limit both readers by the same queue
    // (so 1.0 KiB/s is the combined maximum speed)
    let r1 = limiter.clone().limit(r1);
    let r2 = limiter.limit(r2);

    // do the copy.
    try_join(io::copy(r1, w1), io::copy(r2, w2)).await?;
    Ok(())
}

算法

async-speed-limit 使用单个队列的 令牌桶算法 来限制最大速率。传输通过在发送后添加与消耗的令牌成比例的延迟来进行节流。因此,当令牌桶满时,流量将具有高突发性。

从空到满重新填充桶所需的时间称为 重新填充周期。减少重新填充周期也会减少突发性,但会有更多的睡眠。默认值(0.1秒)对于大多数情况应该足够。

Tokio 0.1

async-speed-limit是为“Futures 0.3”设计的。此包不支持Tokio 0.1,但你可以使用futures-util的 compat 模块 来桥接类型。

Cargo功能

名称 依赖 效果
standard-clock(默认) futures-timer 启用 clock::StandardClock 结构。
fused-future(默认) futures-core limiter::Consume 上实现 FusedFuture
futures-io(默认) futures-io limiter::Resource 上实现 AsyncReadAsyncWrite
read-initializer - 已弃用,不执行任何操作。自 futures-io 0.3.19 以来已删除此功能。

许可证

async-speed-limit 在以下许可证下双授权

依赖项

~0–1.2MB
~21K SLoC