#async-trait #async #nightly

async_trait_proto

使用nightly特性的异步特质

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

Crates.io docs.rs Benchmark Rust

使用在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