1 个不稳定版本
0.1.0 | 2023 年 10 月 2 日 |
---|
#834 在 过程宏
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