11个版本 (6个破坏性版本)

0.7.0 2024年5月1日
0.5.2 2024年4月11日
0.5.0 2024年3月8日
0.2.2 2023年10月5日

#459 in 异步

Download history 15/week @ 2024-04-14 145/week @ 2024-04-21 179/week @ 2024-04-28 5/week @ 2024-05-05 17/week @ 2024-05-12 27/week @ 2024-05-19 33/week @ 2024-05-26 50/week @ 2024-06-02 14/week @ 2024-06-09 209/week @ 2024-06-16 113/week @ 2024-06-23 64/week @ 2024-06-30 1/week @ 2024-07-07 31/week @ 2024-07-14 1/week @ 2024-07-21 152/week @ 2024-07-28

每月下载量 205次
用于 2 crates

Apache-2.0

180KB
4K SLoC

hollywood

Hollywood是一个Rust的actor框架,专注于表示具有异构输入和输出的actors,这些actors被安排在一个非循环的compute图/管道中。设计意图是简单性和最小的样板代码。因此,Hollywood是对异步Rust的一般抽象,特别是对异步tokio运行时的抽象。如果您不寻求这种抽象,您可能希望直接使用tokio(或其他异步运行时)。

Actors是有状态的实体,通过发送消息相互通信。一个actor通过其输入通道接收消息流,处理它们并通过其输出通道向其他actors发送消息。actors要么是无状态的,这样其输出流就是其输入流的纯函数,要么具有内部状态,该状态由传入的消息更新,可能影响其输出消息的内容。

actors被安排在compute管道中(或者更准确地说,是一个有向无环图)。图的第一层由一组一个或多个源actors组成,其输出流由外部资源提供。源actors的一个典型例子包括传感器驱动程序或日志文件读取器。管道的终端actors要么没有输出通道,要么其输出通道未连接。终端actors通常是接收器actors,将数据提供给外部资源。接收器actors的例子包括机器人操作器、日志文件编写器或可视化组件。

除了actors之间的前馈连接之外,actors还可以通过一系列请求-响应通道相互通信。对于哪些actor对可以连接到这样的请求-响应通道没有限制。例如,请求-响应通道可以用来在计算流中创建反馈循环。

示例

以下示例演示了如何创建一个简单的管道,该管道具有周期性源actor,该actor为移动平均actor提供数据。移动平均actor连接到两个打印actor,它们将时间戳和移动平均值打印到控制台。

use hollywood::actors::{Periodic, Printer, PrinterProp};
use hollywood::prelude::*;
use hollywood::example_actors::moving_average::{MovingAverage, MovingAverageProp, MovingAverageState};

let pipeline = Hollywood::configure(&mut |context| {
    let mut timer = Periodic::new_with_period(context, 1.0);
    let mut moving_average = MovingAverage::from_prop_and_state(
        context,
        MovingAverageProp {
            alpha: 0.3,
            timeout: 5.0,
        },
        MovingAverageState::default(),
    );
    let mut time_printer = Printer::<f64>::from_prop_and_state(
        context,
        PrinterProp {
            topic: "time".to_string(),
        },
        NullState::default(),
    );
    let mut average_printer = Printer::<f64>::from_prop_and_state(
        context,
        PrinterProp {
            topic: "average".to_string(),
        },
        NullState::default(),
    );
    timer
        .outbound
        .time_stamp
        .connect(context, &mut moving_average.inbound.value);
    timer
        .outbound
        .time_stamp
        .connect(context, &mut time_printer.inbound.printable);
    moving_average
        .outbound
        .average
        .connect(context, &mut average_printer.inbound.printable);
});
pipeline.print_flow_graph();   
pipeline.run();

print_flow_graph方法的输出是

*Periodic_0*
|   time_stamp   |
        ⡏⠉⠑⠒⠢⠤⠤⣀⣀
        ⡇        ⠉⠉⠑⠒⠢⠤⠤⣀⣀
        ⠁                 ⠁
|     Value      |                  |   Printable    |
*MovingAverage_0*                  *Printer(time)_0*
|    average     |
        ⡇
        ⡇
        ⠁
|   Printable    |
*Printer(average)*  

依赖项

~12–52MB
~860K SLoC