1个稳定版本
1.2.0 | 2020年11月27日 |
---|---|
1.1.1 |
|
#82 in #await
在 agnostik 中使用
6KB
91 行
Agnostik
Agnostik是您应用程序和异步执行器之间的一层。它允许您平滑且容易地切换执行器,而无需更改您的应用程序代码。
功能
- 运行futures并等待它们完成
- 使用底层执行器创建Futures
- 使用能够执行阻塞代码的特殊线程创建阻塞任务
入门
查看 测试 以获取简单示例。
如果您已安装 cargo-edit,则可以执行以下操作
cargo add agnostik
否则,将其添加到您的 Cargo.toml 文件中
agnostik = "0.1.0"
用法
切换执行器
注意:库不应启用任何运行时功能。您可以通过使用 cargo 功能来选择执行器。只能启用一个运行时。有效的功能包括
runtime_bastion
使用 Bastion Executorruntime_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
如果启用了tokio
和smol
bastion
如果启用了async_std
、smol
和/或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