actix rust actor 框架学习 二 ping actor demo 代码
以下是官方文档的学习,了解基本的actix actor 编程模型
项目初始化
- cargo 创建
cargo new actor-ping --bin
- 效果
├── Cargo.toml └── src └── main.rs
添加依赖
- cargo.toml 配置
[package] name = "actor-ping" version = "0.1.0" authors = ["rongfengliang <>"] edition = "2018" ? # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html ? [dependencies] actix = "0.8" ?
创建Actor trait
- actor 代码
use actix::prelude::*; ? struct MyActor { count: usize, } ? impl Actor for MyActor { type Context = Context<Self>; }
说明
每个actor 必须有一个context,后边会有介绍
定义消息
消息是actor 可以接受的数据,消息是任何实现Message
trait 的类型
use actix::prelude::*; ? struct Ping(usize); ? impl Message for Ping { type Result = usize; }
定义消息的handler
handler 是能处理对应消息实现了Handler trait 的方法
impl Handler<Ping> for MyActor { type Result = usize; ? fn handle(&mut self, msg: Ping, _ctx: &mut Context<Self>) -> Self::Result { self.count += msg.0; ? self.count } }
启动actor 以及处理效果
启动actor 依赖context,上边demo 使用的Context
fn main() -> std::io::Result<()> { let system = System::new("test"); ? // start new actor let addr = MyActor{count: 10}.start(); ? // send message and get future for result let res = addr.send(Ping(10)); ? Arbiter::spawn( res.map(|res| { println!("RESULT: {}", res == 20); }) .map_err(|_| ())); ? system.run() }
运行&&效果
- 运行
cargo run
- 效果