#actor-framework #actor #framework #function #async

nightly heph

Heiph是一个基于异步函数的actor框架

3个不稳定版本

0.4.0 2022年4月21日
0.3.1 2021年8月15日
0.3.0 2021年4月1日
0.0.0 2018年12月28日

#800 in 异步

32次每月下载
用于 heph-rt

MIT 许可证

160KB
2K SLoC

Heiph

License: MIT Crates.io Docs

Heiph,来源于 赫菲斯托斯,是希腊的锻造之神,金属工艺、木匠、工匠、艺术家、雕塑家、冶金、火和火山之神。这个库与希腊神没有什么关系,但需要一个名字。

关于

Heiph是一个基于异步函数的 actor 框架。这样的异步函数看起来像这样

async fn actor(mut ctx: actor::Context<String, ThreadLocal>) {
    // Receive a message.
    let msg = ctx.receive_next().await;
    // Print the message.
    println!("got a message: {}", msg);
}

更多示例请参见 示例目录

设计

Heiph使用事件驱动、非阻塞I/O、无共享数据设计。但这些术语究竟是什么意思呢?

  • 事件驱动:Heiph本身不会做任何事情,它必须首先接收到一个事件才开始执行。例如,当使用 TcpListener 时,它会等待操作系统通知 TcpListener 已准备好,然后尝试接受连接。
  • 非阻塞I/O:常规I/O操作需要等待(阻塞)直到操作完成。使用非阻塞或异步I/O意味着我们不会等待操作完成,而是会做些更有用的其他工作,稍后再尝试操作。
  • 无共享数据:许多应用程序在多个线程之间共享数据。为了安全地执行此操作,我们需要通过 Mutex 或使用 原子操作 来保护它,防止数据竞争。Heiph设计为不共享任何数据。每个actor负责其自己的内存,不能访问其他actor拥有的内存。相反,通过发送消息进行通信,请参阅 actor模型

入门

首先,您需要一个最新的nightly编译器。最简单的方法是通过 rustup 安装和管理不同的Rust安装。以下命令将通过rustup安装nightly编译器。

rustup install nightly # Install the latest nightly compiler.

# Optional:
rustup default nightly # Set the nightly compiler as default.

其次,需要将Heiph添加为依赖项。

[dependencies]
heph = "0.3.0"

现在您可以开始编写您的应用程序了!接下来,您可以查看一些示例,或查看API 文档

平台支持

主要目标平台是 Linux,作为生产目标。但我们也支持 macOS,但仅作为开发目标(例如在 macOS 上开发并在生产中使用 Linux)。其他 BSD 平台大多得到支持(kqueue 完全支持),但在这上面没有进行测试。

稳定性

目前这个项目是不稳定的。因为这个crate依赖于许多实验性或Nightly版本仅有的Rust特性。因此,它只能使用rust编译器的Nightly版本进行编译。此外,crate自身版本小于v1,这意味着API也远未稳定。实际上,对API的改进是非常受欢迎的!

许可证

根据MIT许可证授权(LICENSEhttps://opensource.org/licenses/MIT)。

贡献

除非您明确声明,否则您提交的任何有意包含在作品中的贡献都将根据上述许可证授权,不附加任何额外条款或条件。

灵感来源

Heph受到了许多其他框架和语言的影响。最大的灵感来源于Erlang编程语言。从Erlang中借鉴了进程的概念,或者更准确地说,是将函数作为进程。根据actor模型,进程(actor)无法访问彼此的内存,而是使用消息传递。

另一个灵感来源是Akka框架,用于Scala和Java。由于Erlang是一种函数式语言,Akka是用Scala和Java实现的,这些语言与Rust更接近(两者都是面向对象的,但都具有函数式特性)。许多API都是受Akka提供的API启发的,但也有许多重大差异。主要的不同之处在于,Akka的actor是无类型的(或者至少可以是),而Heph的actor是强类型的(就像Rust一样)。

我想提到的最后一个灵感来源是Nginx,Nginx是一个HTTP和反向代理服务器。Nginx使用的架构是运行一个单独的主进程(不是线程),该进程协调多个工作进程(再次不是线程),每个工作进程都有自己的轮询实例(epoll/kqueue等),所有这些实例都共享相同的TCP监听器。在Heph开发的早期阶段,想法是像Nginx一样为每个CPU核心启动一个新的进程。这将允许丢弃所有原子和锁定操作,但后来改为启动线程以降低与其他库一起工作的复杂性。在这个设计中,例如,无法使用任何启动线程的库,因为这可能会引入数据竞争,而Rust非常努力避免这种情况。尽管如此,Heph的架构的大部分灵感都来自于Nginx。

构建模块

除了从他人的工作中获得的灵感之外,Heph还建立在他人工作的基础上。Heph中使用的三个主要组件是futures任务系统(标准库的一部分)、异步函数和Mio

依赖项

~350–510KB
~10K SLoC