#future #async #async-await #await #macro #api-bindings

agnostik-attributes

执行器agnostic属性

1个稳定版本

1.2.0 2020年11月27日
1.1.1 2020年11月23日

#82 in #await


agnostik 中使用

MIT/Apache

6KB
91

Agnostik

Crates.io doc CI

Agnostik是您应用程序和异步执行器之间的一层。它允许您平滑且容易地切换执行器,而无需更改您的应用程序代码。

功能

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

入门

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

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

cargo add agnostik

否则,将其添加到您的 Cargo.toml 文件中

agnostik = "0.1.0"

用法

切换执行器

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

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

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

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

示例

Agnostik的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)
}

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

  • 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 运行时”
  • Agnostik::tokio_with_runtime(runtime) 如果你想要使用你自己的 tokio::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)
}

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

获取帮助

请访问我们的 Discord

许可证

本项目采用 Apache2 或 MIT 许可证。

依赖项

~1.5MB
~35K SLoC