12 个版本
0.1.11 | 2022 年 3 月 20 日 |
---|---|
0.1.10 | 2022 年 2 月 25 日 |
0.1.9 | 2021 年 3 月 28 日 |
0.1.6 | 2020 年 12 月 24 日 |
#437 在 异步
每月 140 次下载
用于 12 个 crate(9 个直接使用)
41KB
667 行
saфина-计时器
提供异步 sleep_for
和 sleep_until
函数。
此 crate 是 safina
的一部分,一个安全的异步运行时。
特性
禁止(不安全代码)
- 仅依赖于
std
- 100% 测试覆盖率
- 时间来源是
std::thread::park_timeout
通过std::sync::mpsc::Receiver::recv_timeout
. - 与
safina-executor
或任何异步执行器一起工作
限制
- 在
stable
上构建需要once_cell
功能。这使用了包含一些不安全代码的once_cell
crate。这是必要的,直到std::lazy::OnceCell
稳定。 - 计时器完成大约 2ms 晚,但决不会早
- 分配内存
示例
safina_timer::start_timer_thread();
let duration = Duration::from_secs(10);
safina_timer::sleep_for(duration).await;
safina_timer::start_timer_thread();
let deadline =
Instant::now() + Duration::from_secs(1);
safina_timer::sleep_until(deadline).await;
safina_timer::start_timer_thread();
let deadline =
Instant::now() + Duration::from_secs(1);
let req = safina_timer::with_deadline(
read_request(), deadline).await??;
let data = safina_timer::with_deadline(
read_data(req), deadline).await??;
safina_timer::with_deadline(
write_data(data), deadline ).await??;
safina_timer::with_deadline(
send_response(data), deadline).await??;
safina_timer::start_timer_thread();
let req = safina_timer::with_timeout(
read_request(), Duration::from_secs(1)
).await??;
let data = safina_timer::with_timeout(
read_data(req), Duration::from_secs(2)
).await??;
safina_timer::with_timeout(
write_data(data), Duration::from_secs(2)
).await??;
safina_timer::with_timeout(
send_response(data),
Duration::from_secs(1)
).await??;
文档
替代方案
- futures-timer
- 流行
- 支持:Wasm、Linux、Windows、macOS
- 包含大量
unsafe
代码 - 使用
std::thread::park_timeout
作为其时间来源
- async-io
- 流行
- 单次和重复计时器
- 支持:Linux、Windows、macOS、iOS、Android 以及许多其他系统。
- 使用polling crate,该crate会对操作系统进行不安全的调用。
- async-timer
- 支持:Linux & Android
- 对操作系统进行不安全的调用
- tokio
- 非常受欢迎
- 单次和重复计时器
- 支持:Linux、macOS、其他类Unix操作系统、Windows
- 速度快,内部复杂,且充满了
unsafe
- embedded-async-timer
无标准库
- 支持
bare_metal
变更日志
- v0.1.11 - 移除一些类型约束。
- v0.1.10 - 使用
safina-executor
v0.2.0。 - v0.1.9 - 命名定时器线程。
- v0.1.8 - 增加测试覆盖率
- v0.1.7 - 支持1.51版rust的稳定版本,以及
once_cell
。 - v0.1.6 - 更新依赖
- v0.1.5 - 更新文档
- v0.1.4 - 升级到新的safina-executor版本,该版本移除了对
Box::pin
的需求。 - v0.1.3 - 在readme中添加徽章
- v0.1.2
- 更新
with_deadline
和with_timeout
- 在
TimerThreadNotStarted
错误上触发panic,并返回新的DeadlineExceeded
结构体,而不是DeadlineError
枚举。这使得调用者可以编写如下的match子句:Err(DeadlineExceeded)
。 - 让它们使用
std::boxed::Box::pin
,这样调用者就不必这样做。
- 在
sleep_until
和sleep_for
将返回()
,如果尚未调用start_timer_thread()
,则触发panic。
- 更新
- v0.1.1
- 根据
std::future::Future::poll
合约,使用传递给SleepFuture::poll
的最近的最新的唤醒者。 - 添加
with_deadline
和with_timeout
函数。
- 根据
- v0.1.0 - 首次发布版本
待办事项
- 添加一种安排作业(
FnOnce
结构体)的方法。
发布流程
- 编辑
Cargo.toml
并增加版本号。 - 运行
./release.sh
许可证:Apache-2.0
依赖项
~47KB