7 个版本

0.2.3 2024 年 6 月 19 日
0.2.2 2018 年 5 月 14 日
0.1.2 2018 年 5 月 8 日
0.1.0 2017 年 12 月 29 日

#246 in 并发

每月 28 次下载

MIT/Apache

18KB
280

Build Status Build status Current Crates.io Version Document

may_actor

基于 may 的 Rust 原生 Actor 库

使用此库

  • 你不需要声明传递给 Actor 的消息
  • 你不需要为你的 Actor 实现 “actor” 接口或 trait。
  • Actor 将自动拥有由 may 提供的 M:N 调度

用法

extern crate may_actor;
use may_actor::Actor;

fn main() {
    struct HelloActor(u32);
    let a = Actor::new(HelloActor(0));

    a.call(|me| {
        me.0 = 10;
        println!("hello world");
    });
    // the with would wait previous messages process done
    a.with(|me| println!("actor value is {}", me.0));
}

有关详细示例,请参阅 pi.rs

功能

  • 通过闭包发送消息 (Actor.call)

您可以使用 call API 向 Actor 发送消息。它接受一个参数为 &mut T 的闭包,因此您可以更改其内部状态。闭包将被发送到 Actor 内部的队列中,Actor 将通过与其关联的协程异步执行闭包。此 API 不会阻塞用户的执行并立即返回。如果闭包中发生 panic,它将在 Actor 的协程上下文中被捕获并忽略。

  • 在 Actor 协程上下文中同步运行闭包 (Actor.with)

您还可以使用 with API 同步地操作 Actor 的内部状态。它接受一个参数为 &mut T 的闭包,因此您可以查看或修改 Actor 的内部状态。如果没有任何待处理的消息,闭包将由关联的协程执行。它将阻塞,直到闭包将结果返回给调用者。如果在闭包中发生 panic,它将传播到调用者的上下文。

  • 从原始实例引用转换为 Actor (Actor.from)

您可以将 &self 类型不安全地转换为其句柄类型 Actor<T>。当需要将 Actor 句柄作为函数参数传递的实现时,这很有用。

然而,从非 Actor 上下文中转换将触发未定义的行为。

  • 允许在闭包消息内部发生 panic,并且这不会杀死 Actor,Actor 将继续处理后续的消息。

  • 演员可以被克隆以获取新的句柄,这就像 Arc<T> 的工作方式一样,如果所有演员句柄都被丢弃,相关的协程将自动退出。

注意

  • 演员在处理消息时将捕获恐慌并忽略任何发生的恐慌,因此目前没有监督和重启策略。只有当所有句柄都被用户丢弃时,演员才会退出。
  • 不要在传入的闭包中调用线程阻塞API,而应调用 May 版本的API。
  • 这个简单的库不支持跨进程创建演员。

许可证

may_actor 的许可证为以下之一,供您选择:

依赖关系

~3–29MB
~422K SLoC