actix/actix:Rust語言的Actor框架

banq發表於2021-11-28

Rust 的 Actor 框架。

  • 非同步和同步actor
  • 本地/執行緒上下文中的 Actor 通訊
  • 使用期貨進行非同步訊息處理
  • Actor 監控
  • 型別化的訊息(無Any型別)
  • 在穩定的 Rust 1.46+ 上執行

使用方法:

在Cargo.toml加入:

[dependencies] actix = "0.12"

定義一個actor,你需要定義一個結構體並讓它實現Actor trait,通過其start和create方法可以生成新的actor 。它提供了幾種不同的建立actor的方法,started,stopping和stopped方法是其生命週期。

use actix::{Actor, Addr, Context, System};

struct MyActor;

impl Actor for MyActor {
    type Context = Context<Self>;

    fn started(&mut self, ctx: &mut Self::Context) {
        println!("I am alive!");
        System::current().stop(); // <- stop system
    }
}

fn main() {
    let mut system = System::new();

    let addr = system.block_on(async { MyActor.start() });

    system.run();
}

Actix 使用Tokio執行時。System::new()建立一個新的事件迴圈。System.run()啟動 Tokio 事件迴圈,並在參與者System收到SystemExit訊息後結束。

 

接受訊息

Actor 通過傳送訊息與另一個 Actor 進行通訊。

use actix::prelude::*;

// this is our Message
// we have to define the response type (rtype)
#[derive(Message)]
#[rtype(result = "usize")]
struct Sum(usize, usize);

// Actor definition
struct Calculator;

impl Actor for Calculator {
    type Context = Context<Self>;
}

// now we need to implement `Handler` on `Calculator` for the `Sum` message.
impl Handler<Sum> for Calculator {
    type Result = usize; // <- Message response type

    fn handle(&mut self, msg: Sum, ctx: &mut Context<Self>) -> Self::Result {
        msg.0 + msg.1
    }
}

#[actix::main] // <- starts the system and block until future resolves
async fn main() {
    let addr = Calculator.start();
    let res = addr.send(Sum(10, 5)).await; // <- send message and get future for result

    match res {
        Ok(result) => println!("SUM: {}", result),
        _ => println!("Communication to the actor has failed"),
    }
}

 

相關文章