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 异步
4,702次月下载
在3个库中使用(通过yocalhost)
67KB
1.5K SLoC
async-speed-limit
异步限制多个字节流的速率(AsyncRead
和 AsyncWrite
)。
使用方法
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 上实现 AsyncRead 和 AsyncWrite 。 |
- | 已弃用,不执行任何操作。自 futures-io 0.3.19 以来已删除此功能。 |
许可证
async-speed-limit 在以下许可证下双授权
- Apache 2.0 协议(LICENSE-Apache 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 协议(LICENSE-MIT 或 https://opensource.org/licenses/MIT)
依赖项
~0–1.2MB
~21K SLoC