#hub #actor-framework #spawn #proc-macro

二进制 derive_hub

一个简单的演员框架的过程宏

1 个不稳定版本

0.1.0 2023 年 10 月 2 日

#834过程宏

MIT/Apache

13KB
123

derive_hub

一个简单的演员中心,可以生成以下代码。


       #[derive(::derive_builder::Builder, ::std::fmt::Debug)]
       pub struct #hub_name {
           #[builder(setter(skip))]
           workers: ::std::vec::Vec<tokio_util::sync::CancellationToken>,
           #(#field_declarations,)*
       }

       impl ::std::ops::Drop for #hub_name {
           fn drop(&mut self) {
               self.shutdown();
           }
       }

       impl #hub_name {
           /// Spawns a given number of workers threads.
           ///
           #[inline]
           pub fn spawn(&mut self, worker_count: usize) -> ::std::vec::Vec<::tokio::task::JoinHandle<()>> {
               assert!(worker_count > 0, "Worker count has to be greater than zero, but got {}", worker_count);
               (0..worker_count)
                   .map(|_| {
                       let token = ::tokio_util::sync::CancellationToken::new();
                       self.workers.push(token.clone());
                       let item = #item_builder::default()
                           #(#inits)*
                           .build()
                           .expect(concat!("Should be able to build ", stringify!(#hub_name), "."));
                       ::tokio::spawn(async move {
                           item.run(token).await;
                       })
                   })
                   .collect::<Vec<_>>()
           }

           /// Shutdown hub.
           ///
           #[inline]
           pub fn shutdown(&self) {
               for worker in &self.workers {
                   worker.cancel();
               }
           }
       }

无效属性

  • #[hub(skip)] - 应与代理结构体构建器的默认函数一起使用。

前置条件

  • 需要安装的包:Tikio、tokio-util、derive-builder。
  • 结构体的成员应位于 Arc 中,中心在生成时会克隆这些成员。
  • 当然,所有成员都必须是 syn 和 send。
  • 结构体必须实现 derive_builder::Builder
  • 具有 derive 属性的结构体必须有一个与方法签名相同的示例方法
pub async fn run(self, flag: tokio_util::sync::CancellationToken) {
       loop {
           tokio::select! {
               biased;
               _ = flag.cancelled() => {
                   /* Wind down actor */
                   break;
               }
               item = self.foo.pop() => {
                   /* Do something important */
               }
               item = self.bar.pop() => {
                   /* Do something important */
               }
               item = self.baz.pop() => {
                   /* Do something important */
               }
           };
       }
   }

建议。

  • 字段最好包含 deadqueue::Queue。

依赖项

~0.8–1.3MB
~27K SLoC