4个版本
0.1.0 | 2022年7月25日 |
---|---|
0.0.3 | 2022年7月24日 |
0.0.2 | 2022年7月23日 |
0.0.1 | 2022年7月23日 |
#1618 in 过程宏
15KB
203 行
async_trait_proto
使用在RFC 3185 Static Async Fn in Traits中描述的降级技术在异步特质中。
它应该比async-trait更快,因为它在每个调用和类型擦除上都不使用分配。
需要这些功能标志和一个nightly编译器
#![功能(generic_associated_types)]
#![功能(type_alias_impl_trait)]
示例
#![feature(generic_associated_types)]
#![feature(type_alias_impl_trait)]
use async_trait_proto::async_trait_proto;
struct Foo;
#[async_trait_proto]
trait Bar {
async fn wait(&self);
}
#[async_trait_proto]
impl Bar for Foo {
async fn wait(&self) {
sleep(Duration::from_secs(10)).await;
}
}
Send + Sync
特质定义可以包含属性,指示生成的Future必须是Send和/或Sync。当使用tokio等工作窃取调度器时,这很重要。
#![feature(generic_associated_types)]
#![feature(type_alias_impl_trait)]
use async_trait_proto::async_trait_proto;
struct Foo;
#[async_trait_proto]
trait Bar {
#[send]
async fn wait(&self);
}
#[async_trait_proto]
impl Bar for Foo {
async fn wait(&self) {
todo!()
}
}
// this trait can now be used with tokio::spawn
async fn spawn_trait<T: Bar + Sync + Send + 'static>(foo: T) {
let handle = tokio::spawn(async move {
foo.wait().await;
});
handle.await;
}
另一方面,这将无法编译
# #![feature(generic_associated_types)]
# #![feature(type_alias_impl_trait)]
# use async_trait_proto::async_trait_proto;
# struct Foo;
#[async_trait_proto]
trait Bar {
async fn wait(&self);
}
# #[async_trait_proto]
# impl Bar for Foo {
# async fn wait(&self) {
# todo!()
# }
# }
// this trait can not now be used with tokio::spawn
async fn spawn_trait<T: Bar + Sync + Send + 'static>(foo: T) {
let handle = tokio::spawn(async move {
foo.wait().await;
});
handle.await;
}
许可证:无许可证
依赖项
~1.5MB
~35K SLoC