7 个不稳定版本 (3 个破坏性更新)
0.4.1 | 2022年7月22日 |
---|---|
0.4.0 | 2022年7月15日 |
0.3.0 | 2022年7月14日 |
0.2.0 | 2022年7月14日 |
0.1.2 | 2022年7月14日 |
110 在 #asynchronous
13KB
109 代码行
simple-actor
基于actor的异步代码的辅助工具。
use futures::FutureExt;
use simple_actor::Actor;
use std::time::Duration;
#[derive(Clone)]
pub struct Adder(Actor<u32>);
impl Adder {
pub fn new(initial_value: u32) -> Self {
let (actor, driver) = Actor::new(initial_value);
tokio::spawn(driver);
Self(actor)
}
pub async fn add(&self, x: u32) -> Option<()> {
self.0.queue(move |state| *state += x).await
}
pub async fn add_delayed(&self, x: u32) -> Option<()> {
self.0.queue_blocking(move |state| async move {
tokio::time::sleep(Duration::from_millis(500)).await;
*state += x
}.boxed()).await
}
pub async fn get(&self) -> Option<u32> {
self.0.query(move |state| *state).await
}
pub async fn get_delayed(&self) -> Option<u32> {
self.0.query_blocking(move |state| async move {
tokio::time::sleep(Duration::from_millis(500)).await;
*state
}.boxed()).await
}
}
#[tokio::main]
async fn main() {
let adder = Adder::new(5);
assert_eq!(adder.add(2).await, Some(()));
assert_eq!(adder.get().await, Some(7));
assert_eq!(adder.add_delayed(3).await, Some(()));
assert_eq!(adder.get_delayed().await, Some(10));
assert!(adder.0.is_active());
adder.0.shutdown();
assert!(!adder.0.is_active());
assert_eq!(adder.add(2).await, None);
assert_eq!(adder.get().await, None);
assert_eq!(adder.add_delayed(2).await, None);
assert_eq!(adder.get_delayed().await, None);
}
灵感
该crate受到ghost_actor
的启发,具有更简单实现和API。
此crate在actor宕机时返回None
或false
,从而避免了错误类型转换的处理。
此crate还允许使用可以在.await
之间保持状态的futures。
依赖项
~1MB
~16K SLoC