#executor #run-time #future #applications #favorite #blocking #async

agnostik

支持在您喜欢的执行器上运行future的执行器无关运行时

12个版本

0.2.3 2021年2月1日
0.2.2 2020年11月27日
0.1.5 2020年8月10日
0.1.4 2020年7月21日
0.0.0 2020年1月21日

#410 in 异步

Download history 135/week @ 2024-03-11 82/week @ 2024-03-18 103/week @ 2024-03-25 129/week @ 2024-04-01 56/week @ 2024-04-08 70/week @ 2024-04-15 77/week @ 2024-04-22 50/week @ 2024-04-29 57/week @ 2024-05-06 58/week @ 2024-05-13 56/week @ 2024-05-20 56/week @ 2024-05-27 57/week @ 2024-06-03 49/week @ 2024-06-10 46/week @ 2024-06-17 43/week @ 2024-06-24

每月 200 次下载

MIT/Apache

31KB
426

阿格诺斯蒂克

Crates.io doc CI

阿格诺斯蒂克位于您的应用程序和异步执行器之间,允许您轻松切换执行器,而无需更改应用程序代码。

特性

  • 运行future并等待其完成
  • 使用底层执行器创建future
  • 使用能够执行阻塞代码的特殊线程创建阻塞任务

入门

查看测试以获取简单示例。

如果您已安装cargo-edit,则可以执行以下操作

cargo add agnostik

否则,将以下内容添加到您的Cargo.toml文件中

agnostik = "0.2.0"

用法

切换执行器

注意:库不应启用任何运行时功能。您可以通过使用cargo功能来选择执行器。只能启用一个运行时。有效功能包括

  • runtime_bastion 用于使用Bastion Executor
  • runtime_tokio 用于使用Tokio运行时
  • runtime_asyncstd 用于使用AsyncStd运行时
  • runtime_smol 用于使用新且出色的smol运行时

例如,要使用Tokio运行时,请将以下行添加到您的Cargo.toml文件中

agnostik = { version = "0.2.0", features = ["runtime_tokio"]}

示例

阿格诺斯蒂克的API非常简单,仅包含少量方法。以下是一个使用bastion-executor的示例。

use agnostik::prelude::*;

fn main() {
    let runtime = Agnostik::bastion();

    let future = runtime.spawn(async {
        println!("Hello from bastions executor!");
    })
    runtime.block_on(future)
    
    let future = runtime.spawn_blocking(|| {
        expensive_blocking_method();
    })
    runtime.block_on(future)
}

还有一个全局执行器实例,可以用于在没有创建和存储自己的执行器的情况下创建future。如果您指定了多个运行时,则全局执行器将是以下内容

  • smol 如果启用了 tokiosmol
  • bastion 如果启用了 async_stdsmol 和/或 tokio
fn main() {
    let future = agnostik::spawn(async { println!("Hello from bastion executor!"); 1 });
    let result = agnostik::block_on(future);
    assert_eq!(result, 1);
}

如果您想使用另一个执行器,只需将 Agnostik::bastion() 方法调用替换为您执行器对应的方法。

使用方法

  • 使用 Agnostik::bastion() 方法来使用堡垒
  • 使用 Agnostik::async_std() 方法来使用异步标准库
  • 使用 Agnostik::tokio() 方法来使用 tokio。 警告: 请参阅“如何使用 tokio 运行时”
  • 如果您想使用自己的 tokio::runtime::Runtime 对象,请使用 Agnostik::tokio_with_runtime(runtime)警告: 请参阅“如何使用 tokio 运行时”
  • 即将推出 Agnostik::no_std() 来创建在 nostd 环境中工作的执行器

如何使用 tokio 运行时

不支持同时使用 tokio::main 宏和 agnostik,因为 Agnostik 需要一个 Runtime 对象,该对象是通过调用 Runtime::new() 创建的。如果您使用的是 tokio::main 宏,将出现 panic,因为您不能在运行时内部创建运行时。

以下是修复方法

use agnostik::prelude::*;

#[tokio::main]
async fn main() {
    let runtime = Agnostik::tokio();
    
    let result = runtime.spawn(async_task()).await;

    println!("The result is {}", result)
}

这将引发 panic。如何正确执行

use agnostik::prelude::*;
use tokio::runtime::Runtime;

fn main() {
    // see tokio docs for more methods to create a runtime
    let runtime = Runtime::new().expect("Failed to create a runtime"); // 1
    let runtime = Agnostik::tokio_with_runtime(runtime); // 2

    let result = runtime.spawn(async_task());
    let result = runtime.block_on(result);

    println!("The result is {}", result)
}

您可以将 1 和 2 替换为 Agnostik::tokio(),因为此方法调用将使用 Runtime::new() 创建一个 Runtime 对象。

获取帮助

请访问我们的 Discord

许可协议

本项目受 Apache2 或 MIT 许可协议许可。

依赖项

~0.3–15MB
~141K SLoC