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 异步
每月 200 次下载
31KB
426 行
阿格诺斯蒂克
阿格诺斯蒂克位于您的应用程序和异步执行器之间,允许您轻松切换执行器,而无需更改应用程序代码。
特性
- 运行future并等待其完成
- 使用底层执行器创建future
- 使用能够执行阻塞代码的特殊线程创建阻塞任务
入门
查看测试以获取简单示例。
如果您已安装cargo-edit,则可以执行以下操作
cargo add agnostik
否则,将以下内容添加到您的Cargo.toml文件中
agnostik = "0.2.0"
用法
切换执行器
注意:库不应启用任何运行时功能。您可以通过使用cargo功能来选择执行器。只能启用一个运行时。有效功能包括
runtime_bastion
用于使用Bastion Executorruntime_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
如果启用了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 运行时” - 如果您想使用自己的
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