#async #future #safe #select #async-test

safeina-select

安全的异步select函数,用于等待多个futures并获取第一个完成的结果。

5个版本

0.1.4 2022年2月25日
0.1.3 2021年3月27日
0.1.2 2020年12月24日
0.1.1 2020年12月12日
0.1.0 2020年12月12日

#1878异步


用于 safina

Apache-2.0

60KB
1.5K SLoC

safeina-select

crates.io version license: Apache 2.0 unsafe forbidden pipeline status

这是一个Rust库,用于等待多个futures并获取第一个完成的结果。

它是安全异步运行时 safina 的一部分。

功能

  • 禁止(不安全代码)
  • 仅依赖于 std
  • 良好的测试覆盖率(96%)
  • safina-executor 或任何异步执行器兼容

限制

  • 可以等待2-5个futures。如果需要更多,可以嵌套使用。

示例

use safina_async_test::async_test;
use safina_select::{select_ab, OptionAb};
let conn = match select_ab(make_new(addr.clone()), get_from_pool(addr.clone())).await {
    OptionAb::A(result) => result?,
    OptionAb::B(result) => result?,
};
// When both futures return the same type, you can use `take`:
let conn = select_ab(make_new(addr.clone()), get_from_pool(addr.clone())).await.take()?;
use safina_async_test::async_test;
use safina_select::{select_ab, OptionAb};
safina_timer::start_timer_thread();
let data = match select_ab(read_data(), safina_timer::sleep_until(deadline)).await {
    OptionAb::A(result) => Ok(result?),
    OptionAb::B(()) => Err("timeout"),
};

文档

https://docs.rs/safina-select

待办事项 - 替代方案

  • tokio::select
    • 非常流行
    • 速度快
    • 内部非常复杂
    • 充满 不安全 代码
  • futures::select
    • 非常流行
    • proc宏,非常复杂
    • 包含少量 不安全 代码

变更日志

  • V0.1.4 - 更新文档。
  • v0.1.3 - 将 OptionAB 重命名为 OptionAb 等。
  • v0.1.2 - 满足pedantic clippy
  • v0.1.1 - 添加到readme中的徽章。将 safina 包重命名为 safina-executor
  • v0.1.0 - 首次发布版本

待办事项

发布流程

  1. 编辑 Cargo.toml 并增加版本号。
  2. 运行 ./release.sh

许可证: Apache-2.0

无运行时依赖